Import libraries

In [19]:
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import os, cv2
from skimage.transform import resize
from sklearn.metrics import confusion_matrix, roc_curve, auc
import math
import smtplib
import pickle
import itertools

from keras.models import Sequential, Model, load_model
from keras.layers import Dense, Dropout, Flatten, GlobalAveragePooling2D
from keras.layers import Conv2D, MaxPooling2D, BatchNormalization
from keras.layers import Lambda, concatenate
from keras import backend as K
#from keras.utils import multi_gpu_model
from keras import applications
from keras import optimizers
from keras.callbacks import ModelCheckpoint, LearningRateScheduler, TensorBoard, EarlyStopping
from keras.preprocessing.image import ImageDataGenerator

print(K.tensorflow_backend._get_available_gpus())
['/job:localhost/replica:0/task:0/device:GPU:0', '/job:localhost/replica:0/task:0/device:GPU:1', '/job:localhost/replica:0/task:0/device:GPU:2', '/job:localhost/replica:0/task:0/device:GPU:3', '/job:localhost/replica:0/task:0/device:GPU:4', '/job:localhost/replica:0/task:0/device:GPU:5', '/job:localhost/replica:0/task:0/device:GPU:6', '/job:localhost/replica:0/task:0/device:GPU:7']

Patched multi_gpu_model function

This is needed to work around saving errors with parallel models. See https://stackoverflow.com/questions/47210811/can-not-save-model-using-model-save-following-multi-gpu-model-in-keras/48066771#48066771. Note that loading the model is slightly different, as described in the link.

In [2]:
def multi_gpu_model(model, gpus):
    if isinstance(gpus, (list, tuple)):
        num_gpus = len(gpus)
        target_gpu_ids = gpus
    else:
        num_gpus = gpus
        target_gpu_ids = range(num_gpus)

    def get_slice(data, i, parts):
        shape = tf.shape(data)
        batch_size = shape[:1]
        input_shape = shape[1:]
        step = batch_size // parts
        if i == num_gpus - 1:
            size = batch_size - step * i
        else:
            size = step
        size = tf.concat([size, input_shape], axis=0)
        stride = tf.concat([step, input_shape * 0], axis=0)
        start = stride * i
        return tf.slice(data, start, size)

    all_outputs = []
    for i in range(len(model.outputs)):
        all_outputs.append([])

    # Place a copy of the model on each GPU,
    # each getting a slice of the inputs.
    for i, gpu_id in enumerate(target_gpu_ids):
        with tf.device('/gpu:%d' % gpu_id):
            with tf.name_scope('replica_%d' % gpu_id):
                inputs = []
                # Retrieve a slice of the input.
                for x in model.inputs:
                    input_shape = tuple(x.get_shape().as_list())[1:]
                    slice_i = Lambda(get_slice,
                           output_shape=input_shape,
                           arguments={'i': i,
                                      'parts': num_gpus})(x)
                    inputs.append(slice_i)

                # Apply model on slice
                # (creating a model replica on the target device).
                outputs = model(inputs)
                if not isinstance(outputs, list):
                    outputs = [outputs]

                # Save the outputs for merging back together later.
                for o in range(len(outputs)):
                    all_outputs[o].append(outputs[o])

    # Merge outputs on CPU.
    with tf.device('/cpu:0'):
        merged = []
        for name, outputs in zip(model.output_names, all_outputs):
            merged.append(concatenate(outputs,
                                axis=0, name=name))
        return Model(model.inputs, merged)

Train a VGGnet on image data

Use VGG19 pretrained on ImageNet to train on retinal OCT dataset using transfer learning, data augmentation

In [36]:
# Constants
img_width, img_height = 256, 256
train_data_dir = "data/train"
validation_data_dir = "data/val"
test_data_dir = "data/test"
nb_train_samples = 66813
nb_validation_samples = 16703
batch_size = 128
epochs = 50
learning_rate = 0.001
mu = 0.9 # Momentum
In [17]:
# Load pretrained model
model = applications.VGG19(weights = "imagenet", include_top=False, input_shape = (img_width, img_height, 3))

We may need to modify the layers based on our dataset - it is small and different from ImageNet. See https://medium.com/@14prakash/transfer-learning-using-keras-d804b2e04ef8

In [18]:
# Freeze the layers which you don't want to train. Here I am freezing the first 5 layers.
for layer in model.layers[:5]:
    layer.trainable = False

#Adding custom Layers 
x = model.output
x = Flatten()(x)
x = Dense(1024, activation="relu")(x)
x = Dropout(0.5)(x)
x = Dense(1024, activation="relu")(x)
predictions = Dense(4, activation="softmax")(x)

# creating the final model 
model_final = Model(input = model.input, output = predictions)

# Parallel computing
model_final = multi_gpu_model(model_final, gpus=8)

# compile the model 
model_final.compile(loss = "categorical_crossentropy", optimizer = optimizers.SGD(lr=learning_rate, momentum=mu), metrics=["accuracy"])
/home/shared/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:14: UserWarning: Update your `Model` call to the Keras 2 API: `Model(inputs=Tensor("in..., outputs=Tensor("de...)`
  
In [19]:
# Initiate the train and test generators with data Augumentation 
train_datagen = ImageDataGenerator(rescale = 1./255,
                                   horizontal_flip = True,
                                   fill_mode = "nearest",
                                   zoom_range = 0.3,
                                   width_shift_range = 0.3,
                                   height_shift_range=0.3,
                                   rotation_range=30)

test_datagen = ImageDataGenerator(rescale = 1./255,
                                  horizontal_flip = True,
                                  fill_mode = "nearest",
                                  zoom_range = 0.3,
                                  width_shift_range = 0.3,
                                  height_shift_range=0.3,
                                  rotation_range=30)

train_generator = train_datagen.flow_from_directory(train_data_dir,
                                                    target_size = (img_height, img_width),
                                                    batch_size = batch_size, 
                                                    class_mode = "categorical")

validation_generator = test_datagen.flow_from_directory(validation_data_dir,
                                                        target_size = (img_height, img_width),
                                                        class_mode = "categorical")
Found 66813 images belonging to 4 classes.
Found 16703 images belonging to 4 classes.
In [20]:
# Save the model according to the conditions  
checkpoint = ModelCheckpoint("vgg19_1.h5", monitor='val_acc', verbose=1, save_best_only=True, save_weights_only=False, mode='auto', period=1)
early = EarlyStopping(monitor='val_acc', min_delta=0, patience=10, verbose=1, mode='auto')
In [21]:
# Train the model 
vgg_history = model_final.fit_generator(train_generator,
                                        steps_per_epoch = math.floor(nb_train_samples/batch_size),
                                        epochs = epochs,
                                        validation_data = validation_generator,
                                        validation_steps = math.floor(nb_validation_samples/batch_size),
                                        callbacks = [checkpoint, early])
# Save history
with open('vgg_train_history.p', 'wb') as f:
    pickle.dump(vgg_history.history,f)
    
# Email notification for when this is done
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login("raa421@gmail.com", "Reventon21!")
 
msg = "HELLO SIR YOUR NETWORK IS TRAINED"
server.sendmail("raa421@gmail.com", "rafiayub@stanford.edu", msg)
server.quit()
print('Done.')
Epoch 1/50
521/521 [==============================] - 1389s 3s/step - loss: 0.4238 - acc: 0.8523 - val_loss: 0.4072 - val_acc: 0.8584

Epoch 00001: val_acc improved from -inf to 0.85841, saving model to vgg16_1.h5
Epoch 2/50
521/521 [==============================] - 1386s 3s/step - loss: 0.2097 - acc: 0.9295 - val_loss: 0.6079 - val_acc: 0.8195

Epoch 00002: val_acc did not improve
Epoch 3/50
521/521 [==============================] - 1365s 3s/step - loss: 0.1776 - acc: 0.9404 - val_loss: 0.3422 - val_acc: 0.8880

Epoch 00003: val_acc improved from 0.85841 to 0.88798, saving model to vgg16_1.h5
Epoch 4/50
521/521 [==============================] - 1394s 3s/step - loss: 0.1595 - acc: 0.9471 - val_loss: 0.2628 - val_acc: 0.9224

Epoch 00004: val_acc improved from 0.88798 to 0.92236, saving model to vgg16_1.h5
Epoch 5/50
521/521 [==============================] - 1388s 3s/step - loss: 0.1517 - acc: 0.9492 - val_loss: 0.2740 - val_acc: 0.9142

Epoch 00005: val_acc did not improve
Epoch 6/50
521/521 [==============================] - 1361s 3s/step - loss: 0.1430 - acc: 0.9519 - val_loss: 0.2186 - val_acc: 0.9262

Epoch 00006: val_acc improved from 0.92236 to 0.92620, saving model to vgg16_1.h5
Epoch 7/50
521/521 [==============================] - 1358s 3s/step - loss: 0.1344 - acc: 0.9554 - val_loss: 0.2923 - val_acc: 0.9026

Epoch 00007: val_acc did not improve
Epoch 8/50
521/521 [==============================] - 1417s 3s/step - loss: 0.1269 - acc: 0.9572 - val_loss: 0.2447 - val_acc: 0.9238

Epoch 00008: val_acc did not improve
Epoch 9/50
521/521 [==============================] - 1408s 3s/step - loss: 0.1263 - acc: 0.9580 - val_loss: 0.2713 - val_acc: 0.9125

Epoch 00009: val_acc did not improve
Epoch 10/50
521/521 [==============================] - 1360s 3s/step - loss: 0.1245 - acc: 0.9585 - val_loss: 0.3252 - val_acc: 0.8959

Epoch 00010: val_acc did not improve
Epoch 11/50
521/521 [==============================] - 1356s 3s/step - loss: 0.1182 - acc: 0.9605 - val_loss: 0.3221 - val_acc: 0.8942

Epoch 00011: val_acc did not improve
Epoch 12/50
521/521 [==============================] - 1356s 3s/step - loss: 0.1149 - acc: 0.9615 - val_loss: 0.2750 - val_acc: 0.9175

Epoch 00012: val_acc did not improve
Epoch 13/50
521/521 [==============================] - 1354s 3s/step - loss: 0.1166 - acc: 0.9608 - val_loss: 0.2377 - val_acc: 0.9286

Epoch 00013: val_acc improved from 0.92620 to 0.92861, saving model to vgg16_1.h5
Epoch 14/50
521/521 [==============================] - 1383s 3s/step - loss: 0.1100 - acc: 0.9628 - val_loss: 0.2042 - val_acc: 0.9358

Epoch 00014: val_acc improved from 0.92861 to 0.93582, saving model to vgg16_1.h5
Epoch 15/50
521/521 [==============================] - 1366s 3s/step - loss: 0.1085 - acc: 0.9632 - val_loss: 0.2833 - val_acc: 0.9094

Epoch 00015: val_acc did not improve
Epoch 16/50
521/521 [==============================] - 1345s 3s/step - loss: 0.1071 - acc: 0.9639 - val_loss: 0.2447 - val_acc: 0.9228

Epoch 00016: val_acc did not improve
Epoch 17/50
521/521 [==============================] - 1342s 3s/step - loss: 0.1043 - acc: 0.9649 - val_loss: 0.2981 - val_acc: 0.9077

Epoch 00017: val_acc did not improve
Epoch 18/50
521/521 [==============================] - 1393s 3s/step - loss: 0.1033 - acc: 0.9652 - val_loss: 0.2500 - val_acc: 0.9219

Epoch 00018: val_acc did not improve
Epoch 19/50
521/521 [==============================] - 1346s 3s/step - loss: 0.0997 - acc: 0.9661 - val_loss: 0.2329 - val_acc: 0.9231

Epoch 00019: val_acc did not improve
Epoch 20/50
521/521 [==============================] - 1348s 3s/step - loss: 0.0973 - acc: 0.9665 - val_loss: 0.2506 - val_acc: 0.9180

Epoch 00020: val_acc did not improve
Epoch 21/50
521/521 [==============================] - 1384s 3s/step - loss: 0.0980 - acc: 0.9676 - val_loss: 0.1837 - val_acc: 0.9404

Epoch 00021: val_acc improved from 0.93582 to 0.94038, saving model to vgg16_1.h5
Epoch 22/50
521/521 [==============================] - 1349s 3s/step - loss: 0.0944 - acc: 0.9680 - val_loss: 0.2497 - val_acc: 0.9238

Epoch 00022: val_acc did not improve
Epoch 23/50
521/521 [==============================] - 1359s 3s/step - loss: 0.0952 - acc: 0.9681 - val_loss: 0.2535 - val_acc: 0.9240

Epoch 00023: val_acc did not improve
Epoch 24/50
521/521 [==============================] - 1364s 3s/step - loss: 0.0950 - acc: 0.9680 - val_loss: 0.2118 - val_acc: 0.9300

Epoch 00024: val_acc did not improve
Epoch 25/50
521/521 [==============================] - 1347s 3s/step - loss: 0.0911 - acc: 0.9692 - val_loss: 0.2464 - val_acc: 0.9209

Epoch 00025: val_acc did not improve
Epoch 26/50
521/521 [==============================] - 1376s 3s/step - loss: 0.0885 - acc: 0.9695 - val_loss: 0.2098 - val_acc: 0.9344

Epoch 00026: val_acc did not improve
Epoch 27/50
521/521 [==============================] - 1369s 3s/step - loss: 0.0890 - acc: 0.9698 - val_loss: 0.2440 - val_acc: 0.9200

Epoch 00027: val_acc did not improve
Epoch 28/50
521/521 [==============================] - 1363s 3s/step - loss: 0.0884 - acc: 0.9704 - val_loss: 0.2422 - val_acc: 0.9221

Epoch 00028: val_acc did not improve
Epoch 29/50
521/521 [==============================] - 1398s 3s/step - loss: 0.0862 - acc: 0.9701 - val_loss: 0.3351 - val_acc: 0.9002

Epoch 00029: val_acc did not improve
Epoch 30/50
521/521 [==============================] - 1429s 3s/step - loss: 0.0831 - acc: 0.9718 - val_loss: 0.2209 - val_acc: 0.9320

Epoch 00030: val_acc did not improve
Epoch 31/50
521/521 [==============================] - 1386s 3s/step - loss: 0.0838 - acc: 0.9710 - val_loss: 0.2426 - val_acc: 0.9267

Epoch 00031: val_acc did not improve
Epoch 00031: early stopping
Done.
In [27]:
# Load history
with open('vgg_train_history.p', 'rb') as f:
    train_history = pickle.load(f)
In [34]:
# History is a dictionary with keys ['acc','loss','val_acc','val_loss'] per epoch
plt.plot(train_history['acc'], label='Training', color='g',linewidth=2,marker='d')
plt.plot(train_history['val_acc'], label='Validation', color='r',linewidth=2,marker='d')
plt.legend()
plt.title('VGG19 accuracy on training dataset')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.savefig('vgg19_acc.jpg')
plt.show()

plt.plot(train_history['loss'], label='Training',color='g',linewidth=2,marker='d')
plt.plot(train_history['val_loss'], label='Validation',color='r',linewidth=2,marker='d')
plt.title('VGG19 loss on training dataset')
plt.legend()
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.savefig('vgg19_loss.jpg')
plt.show()
In [38]:
# Test the network!! First initiate test generator
test_generator = test_datagen.flow_from_directory(test_data_dir,
                                                        target_size = (img_height, img_width),
                                                        class_mode = "categorical")
# Now test model
test_loss = model_final.evaluate_generator(test_generator)
Found 968 images belonging to 4 classes.
In [41]:
model_final.metrics_names
Out[41]:
['loss', 'acc']
In [42]:
print('Test loss: ', test_loss[0])
print('Test acc: ', test_loss[1])
with open('vgg_test_loss.p', 'wb') as f:
    pickle.dump(test_loss,f)
Test loss:  0.05007989506302993
Test acc:  0.9865702479338843

Train an InceptionV3 net

Configuration is based on previous work in Kermany et al.

In [17]:
# Constants
img_width, img_height = 256, 256
train_data_dir = "data/train"
validation_data_dir = "data/val"
test_data_dir = "data/test"
nb_train_samples = 66813
nb_validation_samples = 16703
batch_size = 1000
epochs = 50
learning_rate = 0.001
#mu = 0.9 # Momentum
In [18]:
# Load pretrained model
model = applications.InceptionV3(weights = "imagenet", include_top=False, input_shape = (img_width, img_height, 3))
model.summary()
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_4 (InputLayer)            (None, 256, 256, 3)  0                                            
__________________________________________________________________________________________________
conv2d_283 (Conv2D)             (None, 127, 127, 32) 864         input_4[0][0]                    
__________________________________________________________________________________________________
batch_normalization_283 (BatchN (None, 127, 127, 32) 96          conv2d_283[0][0]                 
__________________________________________________________________________________________________
activation_283 (Activation)     (None, 127, 127, 32) 0           batch_normalization_283[0][0]    
__________________________________________________________________________________________________
conv2d_284 (Conv2D)             (None, 125, 125, 32) 9216        activation_283[0][0]             
__________________________________________________________________________________________________
batch_normalization_284 (BatchN (None, 125, 125, 32) 96          conv2d_284[0][0]                 
__________________________________________________________________________________________________
activation_284 (Activation)     (None, 125, 125, 32) 0           batch_normalization_284[0][0]    
__________________________________________________________________________________________________
conv2d_285 (Conv2D)             (None, 125, 125, 64) 18432       activation_284[0][0]             
__________________________________________________________________________________________________
batch_normalization_285 (BatchN (None, 125, 125, 64) 192         conv2d_285[0][0]                 
__________________________________________________________________________________________________
activation_285 (Activation)     (None, 125, 125, 64) 0           batch_normalization_285[0][0]    
__________________________________________________________________________________________________
max_pooling2d_13 (MaxPooling2D) (None, 62, 62, 64)   0           activation_285[0][0]             
__________________________________________________________________________________________________
conv2d_286 (Conv2D)             (None, 62, 62, 80)   5120        max_pooling2d_13[0][0]           
__________________________________________________________________________________________________
batch_normalization_286 (BatchN (None, 62, 62, 80)   240         conv2d_286[0][0]                 
__________________________________________________________________________________________________
activation_286 (Activation)     (None, 62, 62, 80)   0           batch_normalization_286[0][0]    
__________________________________________________________________________________________________
conv2d_287 (Conv2D)             (None, 60, 60, 192)  138240      activation_286[0][0]             
__________________________________________________________________________________________________
batch_normalization_287 (BatchN (None, 60, 60, 192)  576         conv2d_287[0][0]                 
__________________________________________________________________________________________________
activation_287 (Activation)     (None, 60, 60, 192)  0           batch_normalization_287[0][0]    
__________________________________________________________________________________________________
max_pooling2d_14 (MaxPooling2D) (None, 29, 29, 192)  0           activation_287[0][0]             
__________________________________________________________________________________________________
conv2d_291 (Conv2D)             (None, 29, 29, 64)   12288       max_pooling2d_14[0][0]           
__________________________________________________________________________________________________
batch_normalization_291 (BatchN (None, 29, 29, 64)   192         conv2d_291[0][0]                 
__________________________________________________________________________________________________
activation_291 (Activation)     (None, 29, 29, 64)   0           batch_normalization_291[0][0]    
__________________________________________________________________________________________________
conv2d_289 (Conv2D)             (None, 29, 29, 48)   9216        max_pooling2d_14[0][0]           
__________________________________________________________________________________________________
conv2d_292 (Conv2D)             (None, 29, 29, 96)   55296       activation_291[0][0]             
__________________________________________________________________________________________________
batch_normalization_289 (BatchN (None, 29, 29, 48)   144         conv2d_289[0][0]                 
__________________________________________________________________________________________________
batch_normalization_292 (BatchN (None, 29, 29, 96)   288         conv2d_292[0][0]                 
__________________________________________________________________________________________________
activation_289 (Activation)     (None, 29, 29, 48)   0           batch_normalization_289[0][0]    
__________________________________________________________________________________________________
activation_292 (Activation)     (None, 29, 29, 96)   0           batch_normalization_292[0][0]    
__________________________________________________________________________________________________
average_pooling2d_28 (AveragePo (None, 29, 29, 192)  0           max_pooling2d_14[0][0]           
__________________________________________________________________________________________________
conv2d_288 (Conv2D)             (None, 29, 29, 64)   12288       max_pooling2d_14[0][0]           
__________________________________________________________________________________________________
conv2d_290 (Conv2D)             (None, 29, 29, 64)   76800       activation_289[0][0]             
__________________________________________________________________________________________________
conv2d_293 (Conv2D)             (None, 29, 29, 96)   82944       activation_292[0][0]             
__________________________________________________________________________________________________
conv2d_294 (Conv2D)             (None, 29, 29, 32)   6144        average_pooling2d_28[0][0]       
__________________________________________________________________________________________________
batch_normalization_288 (BatchN (None, 29, 29, 64)   192         conv2d_288[0][0]                 
__________________________________________________________________________________________________
batch_normalization_290 (BatchN (None, 29, 29, 64)   192         conv2d_290[0][0]                 
__________________________________________________________________________________________________
batch_normalization_293 (BatchN (None, 29, 29, 96)   288         conv2d_293[0][0]                 
__________________________________________________________________________________________________
batch_normalization_294 (BatchN (None, 29, 29, 32)   96          conv2d_294[0][0]                 
__________________________________________________________________________________________________
activation_288 (Activation)     (None, 29, 29, 64)   0           batch_normalization_288[0][0]    
__________________________________________________________________________________________________
activation_290 (Activation)     (None, 29, 29, 64)   0           batch_normalization_290[0][0]    
__________________________________________________________________________________________________
activation_293 (Activation)     (None, 29, 29, 96)   0           batch_normalization_293[0][0]    
__________________________________________________________________________________________________
activation_294 (Activation)     (None, 29, 29, 32)   0           batch_normalization_294[0][0]    
__________________________________________________________________________________________________
mixed0 (Concatenate)            (None, 29, 29, 256)  0           activation_288[0][0]             
                                                                 activation_290[0][0]             
                                                                 activation_293[0][0]             
                                                                 activation_294[0][0]             
__________________________________________________________________________________________________
conv2d_298 (Conv2D)             (None, 29, 29, 64)   16384       mixed0[0][0]                     
__________________________________________________________________________________________________
batch_normalization_298 (BatchN (None, 29, 29, 64)   192         conv2d_298[0][0]                 
__________________________________________________________________________________________________
activation_298 (Activation)     (None, 29, 29, 64)   0           batch_normalization_298[0][0]    
__________________________________________________________________________________________________
conv2d_296 (Conv2D)             (None, 29, 29, 48)   12288       mixed0[0][0]                     
__________________________________________________________________________________________________
conv2d_299 (Conv2D)             (None, 29, 29, 96)   55296       activation_298[0][0]             
__________________________________________________________________________________________________
batch_normalization_296 (BatchN (None, 29, 29, 48)   144         conv2d_296[0][0]                 
__________________________________________________________________________________________________
batch_normalization_299 (BatchN (None, 29, 29, 96)   288         conv2d_299[0][0]                 
__________________________________________________________________________________________________
activation_296 (Activation)     (None, 29, 29, 48)   0           batch_normalization_296[0][0]    
__________________________________________________________________________________________________
activation_299 (Activation)     (None, 29, 29, 96)   0           batch_normalization_299[0][0]    
__________________________________________________________________________________________________
average_pooling2d_29 (AveragePo (None, 29, 29, 256)  0           mixed0[0][0]                     
__________________________________________________________________________________________________
conv2d_295 (Conv2D)             (None, 29, 29, 64)   16384       mixed0[0][0]                     
__________________________________________________________________________________________________
conv2d_297 (Conv2D)             (None, 29, 29, 64)   76800       activation_296[0][0]             
__________________________________________________________________________________________________
conv2d_300 (Conv2D)             (None, 29, 29, 96)   82944       activation_299[0][0]             
__________________________________________________________________________________________________
conv2d_301 (Conv2D)             (None, 29, 29, 64)   16384       average_pooling2d_29[0][0]       
__________________________________________________________________________________________________
batch_normalization_295 (BatchN (None, 29, 29, 64)   192         conv2d_295[0][0]                 
__________________________________________________________________________________________________
batch_normalization_297 (BatchN (None, 29, 29, 64)   192         conv2d_297[0][0]                 
__________________________________________________________________________________________________
batch_normalization_300 (BatchN (None, 29, 29, 96)   288         conv2d_300[0][0]                 
__________________________________________________________________________________________________
batch_normalization_301 (BatchN (None, 29, 29, 64)   192         conv2d_301[0][0]                 
__________________________________________________________________________________________________
activation_295 (Activation)     (None, 29, 29, 64)   0           batch_normalization_295[0][0]    
__________________________________________________________________________________________________
activation_297 (Activation)     (None, 29, 29, 64)   0           batch_normalization_297[0][0]    
__________________________________________________________________________________________________
activation_300 (Activation)     (None, 29, 29, 96)   0           batch_normalization_300[0][0]    
__________________________________________________________________________________________________
activation_301 (Activation)     (None, 29, 29, 64)   0           batch_normalization_301[0][0]    
__________________________________________________________________________________________________
mixed1 (Concatenate)            (None, 29, 29, 288)  0           activation_295[0][0]             
                                                                 activation_297[0][0]             
                                                                 activation_300[0][0]             
                                                                 activation_301[0][0]             
__________________________________________________________________________________________________
conv2d_305 (Conv2D)             (None, 29, 29, 64)   18432       mixed1[0][0]                     
__________________________________________________________________________________________________
batch_normalization_305 (BatchN (None, 29, 29, 64)   192         conv2d_305[0][0]                 
__________________________________________________________________________________________________
activation_305 (Activation)     (None, 29, 29, 64)   0           batch_normalization_305[0][0]    
__________________________________________________________________________________________________
conv2d_303 (Conv2D)             (None, 29, 29, 48)   13824       mixed1[0][0]                     
__________________________________________________________________________________________________
conv2d_306 (Conv2D)             (None, 29, 29, 96)   55296       activation_305[0][0]             
__________________________________________________________________________________________________
batch_normalization_303 (BatchN (None, 29, 29, 48)   144         conv2d_303[0][0]                 
__________________________________________________________________________________________________
batch_normalization_306 (BatchN (None, 29, 29, 96)   288         conv2d_306[0][0]                 
__________________________________________________________________________________________________
activation_303 (Activation)     (None, 29, 29, 48)   0           batch_normalization_303[0][0]    
__________________________________________________________________________________________________
activation_306 (Activation)     (None, 29, 29, 96)   0           batch_normalization_306[0][0]    
__________________________________________________________________________________________________
average_pooling2d_30 (AveragePo (None, 29, 29, 288)  0           mixed1[0][0]                     
__________________________________________________________________________________________________
conv2d_302 (Conv2D)             (None, 29, 29, 64)   18432       mixed1[0][0]                     
__________________________________________________________________________________________________
conv2d_304 (Conv2D)             (None, 29, 29, 64)   76800       activation_303[0][0]             
__________________________________________________________________________________________________
conv2d_307 (Conv2D)             (None, 29, 29, 96)   82944       activation_306[0][0]             
__________________________________________________________________________________________________
conv2d_308 (Conv2D)             (None, 29, 29, 64)   18432       average_pooling2d_30[0][0]       
__________________________________________________________________________________________________
batch_normalization_302 (BatchN (None, 29, 29, 64)   192         conv2d_302[0][0]                 
__________________________________________________________________________________________________
batch_normalization_304 (BatchN (None, 29, 29, 64)   192         conv2d_304[0][0]                 
__________________________________________________________________________________________________
batch_normalization_307 (BatchN (None, 29, 29, 96)   288         conv2d_307[0][0]                 
__________________________________________________________________________________________________
batch_normalization_308 (BatchN (None, 29, 29, 64)   192         conv2d_308[0][0]                 
__________________________________________________________________________________________________
activation_302 (Activation)     (None, 29, 29, 64)   0           batch_normalization_302[0][0]    
__________________________________________________________________________________________________
activation_304 (Activation)     (None, 29, 29, 64)   0           batch_normalization_304[0][0]    
__________________________________________________________________________________________________
activation_307 (Activation)     (None, 29, 29, 96)   0           batch_normalization_307[0][0]    
__________________________________________________________________________________________________
activation_308 (Activation)     (None, 29, 29, 64)   0           batch_normalization_308[0][0]    
__________________________________________________________________________________________________
mixed2 (Concatenate)            (None, 29, 29, 288)  0           activation_302[0][0]             
                                                                 activation_304[0][0]             
                                                                 activation_307[0][0]             
                                                                 activation_308[0][0]             
__________________________________________________________________________________________________
conv2d_310 (Conv2D)             (None, 29, 29, 64)   18432       mixed2[0][0]                     
__________________________________________________________________________________________________
batch_normalization_310 (BatchN (None, 29, 29, 64)   192         conv2d_310[0][0]                 
__________________________________________________________________________________________________
activation_310 (Activation)     (None, 29, 29, 64)   0           batch_normalization_310[0][0]    
__________________________________________________________________________________________________
conv2d_311 (Conv2D)             (None, 29, 29, 96)   55296       activation_310[0][0]             
__________________________________________________________________________________________________
batch_normalization_311 (BatchN (None, 29, 29, 96)   288         conv2d_311[0][0]                 
__________________________________________________________________________________________________
activation_311 (Activation)     (None, 29, 29, 96)   0           batch_normalization_311[0][0]    
__________________________________________________________________________________________________
conv2d_309 (Conv2D)             (None, 14, 14, 384)  995328      mixed2[0][0]                     
__________________________________________________________________________________________________
conv2d_312 (Conv2D)             (None, 14, 14, 96)   82944       activation_311[0][0]             
__________________________________________________________________________________________________
batch_normalization_309 (BatchN (None, 14, 14, 384)  1152        conv2d_309[0][0]                 
__________________________________________________________________________________________________
batch_normalization_312 (BatchN (None, 14, 14, 96)   288         conv2d_312[0][0]                 
__________________________________________________________________________________________________
activation_309 (Activation)     (None, 14, 14, 384)  0           batch_normalization_309[0][0]    
__________________________________________________________________________________________________
activation_312 (Activation)     (None, 14, 14, 96)   0           batch_normalization_312[0][0]    
__________________________________________________________________________________________________
max_pooling2d_15 (MaxPooling2D) (None, 14, 14, 288)  0           mixed2[0][0]                     
__________________________________________________________________________________________________
mixed3 (Concatenate)            (None, 14, 14, 768)  0           activation_309[0][0]             
                                                                 activation_312[0][0]             
                                                                 max_pooling2d_15[0][0]           
__________________________________________________________________________________________________
conv2d_317 (Conv2D)             (None, 14, 14, 128)  98304       mixed3[0][0]                     
__________________________________________________________________________________________________
batch_normalization_317 (BatchN (None, 14, 14, 128)  384         conv2d_317[0][0]                 
__________________________________________________________________________________________________
activation_317 (Activation)     (None, 14, 14, 128)  0           batch_normalization_317[0][0]    
__________________________________________________________________________________________________
conv2d_318 (Conv2D)             (None, 14, 14, 128)  114688      activation_317[0][0]             
__________________________________________________________________________________________________
batch_normalization_318 (BatchN (None, 14, 14, 128)  384         conv2d_318[0][0]                 
__________________________________________________________________________________________________
activation_318 (Activation)     (None, 14, 14, 128)  0           batch_normalization_318[0][0]    
__________________________________________________________________________________________________
conv2d_314 (Conv2D)             (None, 14, 14, 128)  98304       mixed3[0][0]                     
__________________________________________________________________________________________________
conv2d_319 (Conv2D)             (None, 14, 14, 128)  114688      activation_318[0][0]             
__________________________________________________________________________________________________
batch_normalization_314 (BatchN (None, 14, 14, 128)  384         conv2d_314[0][0]                 
__________________________________________________________________________________________________
batch_normalization_319 (BatchN (None, 14, 14, 128)  384         conv2d_319[0][0]                 
__________________________________________________________________________________________________
activation_314 (Activation)     (None, 14, 14, 128)  0           batch_normalization_314[0][0]    
__________________________________________________________________________________________________
activation_319 (Activation)     (None, 14, 14, 128)  0           batch_normalization_319[0][0]    
__________________________________________________________________________________________________
conv2d_315 (Conv2D)             (None, 14, 14, 128)  114688      activation_314[0][0]             
__________________________________________________________________________________________________
conv2d_320 (Conv2D)             (None, 14, 14, 128)  114688      activation_319[0][0]             
__________________________________________________________________________________________________
batch_normalization_315 (BatchN (None, 14, 14, 128)  384         conv2d_315[0][0]                 
__________________________________________________________________________________________________
batch_normalization_320 (BatchN (None, 14, 14, 128)  384         conv2d_320[0][0]                 
__________________________________________________________________________________________________
activation_315 (Activation)     (None, 14, 14, 128)  0           batch_normalization_315[0][0]    
__________________________________________________________________________________________________
activation_320 (Activation)     (None, 14, 14, 128)  0           batch_normalization_320[0][0]    
__________________________________________________________________________________________________
average_pooling2d_31 (AveragePo (None, 14, 14, 768)  0           mixed3[0][0]                     
__________________________________________________________________________________________________
conv2d_313 (Conv2D)             (None, 14, 14, 192)  147456      mixed3[0][0]                     
__________________________________________________________________________________________________
conv2d_316 (Conv2D)             (None, 14, 14, 192)  172032      activation_315[0][0]             
__________________________________________________________________________________________________
conv2d_321 (Conv2D)             (None, 14, 14, 192)  172032      activation_320[0][0]             
__________________________________________________________________________________________________
conv2d_322 (Conv2D)             (None, 14, 14, 192)  147456      average_pooling2d_31[0][0]       
__________________________________________________________________________________________________
batch_normalization_313 (BatchN (None, 14, 14, 192)  576         conv2d_313[0][0]                 
__________________________________________________________________________________________________
batch_normalization_316 (BatchN (None, 14, 14, 192)  576         conv2d_316[0][0]                 
__________________________________________________________________________________________________
batch_normalization_321 (BatchN (None, 14, 14, 192)  576         conv2d_321[0][0]                 
__________________________________________________________________________________________________
batch_normalization_322 (BatchN (None, 14, 14, 192)  576         conv2d_322[0][0]                 
__________________________________________________________________________________________________
activation_313 (Activation)     (None, 14, 14, 192)  0           batch_normalization_313[0][0]    
__________________________________________________________________________________________________
activation_316 (Activation)     (None, 14, 14, 192)  0           batch_normalization_316[0][0]    
__________________________________________________________________________________________________
activation_321 (Activation)     (None, 14, 14, 192)  0           batch_normalization_321[0][0]    
__________________________________________________________________________________________________
activation_322 (Activation)     (None, 14, 14, 192)  0           batch_normalization_322[0][0]    
__________________________________________________________________________________________________
mixed4 (Concatenate)            (None, 14, 14, 768)  0           activation_313[0][0]             
                                                                 activation_316[0][0]             
                                                                 activation_321[0][0]             
                                                                 activation_322[0][0]             
__________________________________________________________________________________________________
conv2d_327 (Conv2D)             (None, 14, 14, 160)  122880      mixed4[0][0]                     
__________________________________________________________________________________________________
batch_normalization_327 (BatchN (None, 14, 14, 160)  480         conv2d_327[0][0]                 
__________________________________________________________________________________________________
activation_327 (Activation)     (None, 14, 14, 160)  0           batch_normalization_327[0][0]    
__________________________________________________________________________________________________
conv2d_328 (Conv2D)             (None, 14, 14, 160)  179200      activation_327[0][0]             
__________________________________________________________________________________________________
batch_normalization_328 (BatchN (None, 14, 14, 160)  480         conv2d_328[0][0]                 
__________________________________________________________________________________________________
activation_328 (Activation)     (None, 14, 14, 160)  0           batch_normalization_328[0][0]    
__________________________________________________________________________________________________
conv2d_324 (Conv2D)             (None, 14, 14, 160)  122880      mixed4[0][0]                     
__________________________________________________________________________________________________
conv2d_329 (Conv2D)             (None, 14, 14, 160)  179200      activation_328[0][0]             
__________________________________________________________________________________________________
batch_normalization_324 (BatchN (None, 14, 14, 160)  480         conv2d_324[0][0]                 
__________________________________________________________________________________________________
batch_normalization_329 (BatchN (None, 14, 14, 160)  480         conv2d_329[0][0]                 
__________________________________________________________________________________________________
activation_324 (Activation)     (None, 14, 14, 160)  0           batch_normalization_324[0][0]    
__________________________________________________________________________________________________
activation_329 (Activation)     (None, 14, 14, 160)  0           batch_normalization_329[0][0]    
__________________________________________________________________________________________________
conv2d_325 (Conv2D)             (None, 14, 14, 160)  179200      activation_324[0][0]             
__________________________________________________________________________________________________
conv2d_330 (Conv2D)             (None, 14, 14, 160)  179200      activation_329[0][0]             
__________________________________________________________________________________________________
batch_normalization_325 (BatchN (None, 14, 14, 160)  480         conv2d_325[0][0]                 
__________________________________________________________________________________________________
batch_normalization_330 (BatchN (None, 14, 14, 160)  480         conv2d_330[0][0]                 
__________________________________________________________________________________________________
activation_325 (Activation)     (None, 14, 14, 160)  0           batch_normalization_325[0][0]    
__________________________________________________________________________________________________
activation_330 (Activation)     (None, 14, 14, 160)  0           batch_normalization_330[0][0]    
__________________________________________________________________________________________________
average_pooling2d_32 (AveragePo (None, 14, 14, 768)  0           mixed4[0][0]                     
__________________________________________________________________________________________________
conv2d_323 (Conv2D)             (None, 14, 14, 192)  147456      mixed4[0][0]                     
__________________________________________________________________________________________________
conv2d_326 (Conv2D)             (None, 14, 14, 192)  215040      activation_325[0][0]             
__________________________________________________________________________________________________
conv2d_331 (Conv2D)             (None, 14, 14, 192)  215040      activation_330[0][0]             
__________________________________________________________________________________________________
conv2d_332 (Conv2D)             (None, 14, 14, 192)  147456      average_pooling2d_32[0][0]       
__________________________________________________________________________________________________
batch_normalization_323 (BatchN (None, 14, 14, 192)  576         conv2d_323[0][0]                 
__________________________________________________________________________________________________
batch_normalization_326 (BatchN (None, 14, 14, 192)  576         conv2d_326[0][0]                 
__________________________________________________________________________________________________
batch_normalization_331 (BatchN (None, 14, 14, 192)  576         conv2d_331[0][0]                 
__________________________________________________________________________________________________
batch_normalization_332 (BatchN (None, 14, 14, 192)  576         conv2d_332[0][0]                 
__________________________________________________________________________________________________
activation_323 (Activation)     (None, 14, 14, 192)  0           batch_normalization_323[0][0]    
__________________________________________________________________________________________________
activation_326 (Activation)     (None, 14, 14, 192)  0           batch_normalization_326[0][0]    
__________________________________________________________________________________________________
activation_331 (Activation)     (None, 14, 14, 192)  0           batch_normalization_331[0][0]    
__________________________________________________________________________________________________
activation_332 (Activation)     (None, 14, 14, 192)  0           batch_normalization_332[0][0]    
__________________________________________________________________________________________________
mixed5 (Concatenate)            (None, 14, 14, 768)  0           activation_323[0][0]             
                                                                 activation_326[0][0]             
                                                                 activation_331[0][0]             
                                                                 activation_332[0][0]             
__________________________________________________________________________________________________
conv2d_337 (Conv2D)             (None, 14, 14, 160)  122880      mixed5[0][0]                     
__________________________________________________________________________________________________
batch_normalization_337 (BatchN (None, 14, 14, 160)  480         conv2d_337[0][0]                 
__________________________________________________________________________________________________
activation_337 (Activation)     (None, 14, 14, 160)  0           batch_normalization_337[0][0]    
__________________________________________________________________________________________________
conv2d_338 (Conv2D)             (None, 14, 14, 160)  179200      activation_337[0][0]             
__________________________________________________________________________________________________
batch_normalization_338 (BatchN (None, 14, 14, 160)  480         conv2d_338[0][0]                 
__________________________________________________________________________________________________
activation_338 (Activation)     (None, 14, 14, 160)  0           batch_normalization_338[0][0]    
__________________________________________________________________________________________________
conv2d_334 (Conv2D)             (None, 14, 14, 160)  122880      mixed5[0][0]                     
__________________________________________________________________________________________________
conv2d_339 (Conv2D)             (None, 14, 14, 160)  179200      activation_338[0][0]             
__________________________________________________________________________________________________
batch_normalization_334 (BatchN (None, 14, 14, 160)  480         conv2d_334[0][0]                 
__________________________________________________________________________________________________
batch_normalization_339 (BatchN (None, 14, 14, 160)  480         conv2d_339[0][0]                 
__________________________________________________________________________________________________
activation_334 (Activation)     (None, 14, 14, 160)  0           batch_normalization_334[0][0]    
__________________________________________________________________________________________________
activation_339 (Activation)     (None, 14, 14, 160)  0           batch_normalization_339[0][0]    
__________________________________________________________________________________________________
conv2d_335 (Conv2D)             (None, 14, 14, 160)  179200      activation_334[0][0]             
__________________________________________________________________________________________________
conv2d_340 (Conv2D)             (None, 14, 14, 160)  179200      activation_339[0][0]             
__________________________________________________________________________________________________
batch_normalization_335 (BatchN (None, 14, 14, 160)  480         conv2d_335[0][0]                 
__________________________________________________________________________________________________
batch_normalization_340 (BatchN (None, 14, 14, 160)  480         conv2d_340[0][0]                 
__________________________________________________________________________________________________
activation_335 (Activation)     (None, 14, 14, 160)  0           batch_normalization_335[0][0]    
__________________________________________________________________________________________________
activation_340 (Activation)     (None, 14, 14, 160)  0           batch_normalization_340[0][0]    
__________________________________________________________________________________________________
average_pooling2d_33 (AveragePo (None, 14, 14, 768)  0           mixed5[0][0]                     
__________________________________________________________________________________________________
conv2d_333 (Conv2D)             (None, 14, 14, 192)  147456      mixed5[0][0]                     
__________________________________________________________________________________________________
conv2d_336 (Conv2D)             (None, 14, 14, 192)  215040      activation_335[0][0]             
__________________________________________________________________________________________________
conv2d_341 (Conv2D)             (None, 14, 14, 192)  215040      activation_340[0][0]             
__________________________________________________________________________________________________
conv2d_342 (Conv2D)             (None, 14, 14, 192)  147456      average_pooling2d_33[0][0]       
__________________________________________________________________________________________________
batch_normalization_333 (BatchN (None, 14, 14, 192)  576         conv2d_333[0][0]                 
__________________________________________________________________________________________________
batch_normalization_336 (BatchN (None, 14, 14, 192)  576         conv2d_336[0][0]                 
__________________________________________________________________________________________________
batch_normalization_341 (BatchN (None, 14, 14, 192)  576         conv2d_341[0][0]                 
__________________________________________________________________________________________________
batch_normalization_342 (BatchN (None, 14, 14, 192)  576         conv2d_342[0][0]                 
__________________________________________________________________________________________________
activation_333 (Activation)     (None, 14, 14, 192)  0           batch_normalization_333[0][0]    
__________________________________________________________________________________________________
activation_336 (Activation)     (None, 14, 14, 192)  0           batch_normalization_336[0][0]    
__________________________________________________________________________________________________
activation_341 (Activation)     (None, 14, 14, 192)  0           batch_normalization_341[0][0]    
__________________________________________________________________________________________________
activation_342 (Activation)     (None, 14, 14, 192)  0           batch_normalization_342[0][0]    
__________________________________________________________________________________________________
mixed6 (Concatenate)            (None, 14, 14, 768)  0           activation_333[0][0]             
                                                                 activation_336[0][0]             
                                                                 activation_341[0][0]             
                                                                 activation_342[0][0]             
__________________________________________________________________________________________________
conv2d_347 (Conv2D)             (None, 14, 14, 192)  147456      mixed6[0][0]                     
__________________________________________________________________________________________________
batch_normalization_347 (BatchN (None, 14, 14, 192)  576         conv2d_347[0][0]                 
__________________________________________________________________________________________________
activation_347 (Activation)     (None, 14, 14, 192)  0           batch_normalization_347[0][0]    
__________________________________________________________________________________________________
conv2d_348 (Conv2D)             (None, 14, 14, 192)  258048      activation_347[0][0]             
__________________________________________________________________________________________________
batch_normalization_348 (BatchN (None, 14, 14, 192)  576         conv2d_348[0][0]                 
__________________________________________________________________________________________________
activation_348 (Activation)     (None, 14, 14, 192)  0           batch_normalization_348[0][0]    
__________________________________________________________________________________________________
conv2d_344 (Conv2D)             (None, 14, 14, 192)  147456      mixed6[0][0]                     
__________________________________________________________________________________________________
conv2d_349 (Conv2D)             (None, 14, 14, 192)  258048      activation_348[0][0]             
__________________________________________________________________________________________________
batch_normalization_344 (BatchN (None, 14, 14, 192)  576         conv2d_344[0][0]                 
__________________________________________________________________________________________________
batch_normalization_349 (BatchN (None, 14, 14, 192)  576         conv2d_349[0][0]                 
__________________________________________________________________________________________________
activation_344 (Activation)     (None, 14, 14, 192)  0           batch_normalization_344[0][0]    
__________________________________________________________________________________________________
activation_349 (Activation)     (None, 14, 14, 192)  0           batch_normalization_349[0][0]    
__________________________________________________________________________________________________
conv2d_345 (Conv2D)             (None, 14, 14, 192)  258048      activation_344[0][0]             
__________________________________________________________________________________________________
conv2d_350 (Conv2D)             (None, 14, 14, 192)  258048      activation_349[0][0]             
__________________________________________________________________________________________________
batch_normalization_345 (BatchN (None, 14, 14, 192)  576         conv2d_345[0][0]                 
__________________________________________________________________________________________________
batch_normalization_350 (BatchN (None, 14, 14, 192)  576         conv2d_350[0][0]                 
__________________________________________________________________________________________________
activation_345 (Activation)     (None, 14, 14, 192)  0           batch_normalization_345[0][0]    
__________________________________________________________________________________________________
activation_350 (Activation)     (None, 14, 14, 192)  0           batch_normalization_350[0][0]    
__________________________________________________________________________________________________
average_pooling2d_34 (AveragePo (None, 14, 14, 768)  0           mixed6[0][0]                     
__________________________________________________________________________________________________
conv2d_343 (Conv2D)             (None, 14, 14, 192)  147456      mixed6[0][0]                     
__________________________________________________________________________________________________
conv2d_346 (Conv2D)             (None, 14, 14, 192)  258048      activation_345[0][0]             
__________________________________________________________________________________________________
conv2d_351 (Conv2D)             (None, 14, 14, 192)  258048      activation_350[0][0]             
__________________________________________________________________________________________________
conv2d_352 (Conv2D)             (None, 14, 14, 192)  147456      average_pooling2d_34[0][0]       
__________________________________________________________________________________________________
batch_normalization_343 (BatchN (None, 14, 14, 192)  576         conv2d_343[0][0]                 
__________________________________________________________________________________________________
batch_normalization_346 (BatchN (None, 14, 14, 192)  576         conv2d_346[0][0]                 
__________________________________________________________________________________________________
batch_normalization_351 (BatchN (None, 14, 14, 192)  576         conv2d_351[0][0]                 
__________________________________________________________________________________________________
batch_normalization_352 (BatchN (None, 14, 14, 192)  576         conv2d_352[0][0]                 
__________________________________________________________________________________________________
activation_343 (Activation)     (None, 14, 14, 192)  0           batch_normalization_343[0][0]    
__________________________________________________________________________________________________
activation_346 (Activation)     (None, 14, 14, 192)  0           batch_normalization_346[0][0]    
__________________________________________________________________________________________________
activation_351 (Activation)     (None, 14, 14, 192)  0           batch_normalization_351[0][0]    
__________________________________________________________________________________________________
activation_352 (Activation)     (None, 14, 14, 192)  0           batch_normalization_352[0][0]    
__________________________________________________________________________________________________
mixed7 (Concatenate)            (None, 14, 14, 768)  0           activation_343[0][0]             
                                                                 activation_346[0][0]             
                                                                 activation_351[0][0]             
                                                                 activation_352[0][0]             
__________________________________________________________________________________________________
conv2d_355 (Conv2D)             (None, 14, 14, 192)  147456      mixed7[0][0]                     
__________________________________________________________________________________________________
batch_normalization_355 (BatchN (None, 14, 14, 192)  576         conv2d_355[0][0]                 
__________________________________________________________________________________________________
activation_355 (Activation)     (None, 14, 14, 192)  0           batch_normalization_355[0][0]    
__________________________________________________________________________________________________
conv2d_356 (Conv2D)             (None, 14, 14, 192)  258048      activation_355[0][0]             
__________________________________________________________________________________________________
batch_normalization_356 (BatchN (None, 14, 14, 192)  576         conv2d_356[0][0]                 
__________________________________________________________________________________________________
activation_356 (Activation)     (None, 14, 14, 192)  0           batch_normalization_356[0][0]    
__________________________________________________________________________________________________
conv2d_353 (Conv2D)             (None, 14, 14, 192)  147456      mixed7[0][0]                     
__________________________________________________________________________________________________
conv2d_357 (Conv2D)             (None, 14, 14, 192)  258048      activation_356[0][0]             
__________________________________________________________________________________________________
batch_normalization_353 (BatchN (None, 14, 14, 192)  576         conv2d_353[0][0]                 
__________________________________________________________________________________________________
batch_normalization_357 (BatchN (None, 14, 14, 192)  576         conv2d_357[0][0]                 
__________________________________________________________________________________________________
activation_353 (Activation)     (None, 14, 14, 192)  0           batch_normalization_353[0][0]    
__________________________________________________________________________________________________
activation_357 (Activation)     (None, 14, 14, 192)  0           batch_normalization_357[0][0]    
__________________________________________________________________________________________________
conv2d_354 (Conv2D)             (None, 6, 6, 320)    552960      activation_353[0][0]             
__________________________________________________________________________________________________
conv2d_358 (Conv2D)             (None, 6, 6, 192)    331776      activation_357[0][0]             
__________________________________________________________________________________________________
batch_normalization_354 (BatchN (None, 6, 6, 320)    960         conv2d_354[0][0]                 
__________________________________________________________________________________________________
batch_normalization_358 (BatchN (None, 6, 6, 192)    576         conv2d_358[0][0]                 
__________________________________________________________________________________________________
activation_354 (Activation)     (None, 6, 6, 320)    0           batch_normalization_354[0][0]    
__________________________________________________________________________________________________
activation_358 (Activation)     (None, 6, 6, 192)    0           batch_normalization_358[0][0]    
__________________________________________________________________________________________________
max_pooling2d_16 (MaxPooling2D) (None, 6, 6, 768)    0           mixed7[0][0]                     
__________________________________________________________________________________________________
mixed8 (Concatenate)            (None, 6, 6, 1280)   0           activation_354[0][0]             
                                                                 activation_358[0][0]             
                                                                 max_pooling2d_16[0][0]           
__________________________________________________________________________________________________
conv2d_363 (Conv2D)             (None, 6, 6, 448)    573440      mixed8[0][0]                     
__________________________________________________________________________________________________
batch_normalization_363 (BatchN (None, 6, 6, 448)    1344        conv2d_363[0][0]                 
__________________________________________________________________________________________________
activation_363 (Activation)     (None, 6, 6, 448)    0           batch_normalization_363[0][0]    
__________________________________________________________________________________________________
conv2d_360 (Conv2D)             (None, 6, 6, 384)    491520      mixed8[0][0]                     
__________________________________________________________________________________________________
conv2d_364 (Conv2D)             (None, 6, 6, 384)    1548288     activation_363[0][0]             
__________________________________________________________________________________________________
batch_normalization_360 (BatchN (None, 6, 6, 384)    1152        conv2d_360[0][0]                 
__________________________________________________________________________________________________
batch_normalization_364 (BatchN (None, 6, 6, 384)    1152        conv2d_364[0][0]                 
__________________________________________________________________________________________________
activation_360 (Activation)     (None, 6, 6, 384)    0           batch_normalization_360[0][0]    
__________________________________________________________________________________________________
activation_364 (Activation)     (None, 6, 6, 384)    0           batch_normalization_364[0][0]    
__________________________________________________________________________________________________
conv2d_361 (Conv2D)             (None, 6, 6, 384)    442368      activation_360[0][0]             
__________________________________________________________________________________________________
conv2d_362 (Conv2D)             (None, 6, 6, 384)    442368      activation_360[0][0]             
__________________________________________________________________________________________________
conv2d_365 (Conv2D)             (None, 6, 6, 384)    442368      activation_364[0][0]             
__________________________________________________________________________________________________
conv2d_366 (Conv2D)             (None, 6, 6, 384)    442368      activation_364[0][0]             
__________________________________________________________________________________________________
average_pooling2d_35 (AveragePo (None, 6, 6, 1280)   0           mixed8[0][0]                     
__________________________________________________________________________________________________
conv2d_359 (Conv2D)             (None, 6, 6, 320)    409600      mixed8[0][0]                     
__________________________________________________________________________________________________
batch_normalization_361 (BatchN (None, 6, 6, 384)    1152        conv2d_361[0][0]                 
__________________________________________________________________________________________________
batch_normalization_362 (BatchN (None, 6, 6, 384)    1152        conv2d_362[0][0]                 
__________________________________________________________________________________________________
batch_normalization_365 (BatchN (None, 6, 6, 384)    1152        conv2d_365[0][0]                 
__________________________________________________________________________________________________
batch_normalization_366 (BatchN (None, 6, 6, 384)    1152        conv2d_366[0][0]                 
__________________________________________________________________________________________________
conv2d_367 (Conv2D)             (None, 6, 6, 192)    245760      average_pooling2d_35[0][0]       
__________________________________________________________________________________________________
batch_normalization_359 (BatchN (None, 6, 6, 320)    960         conv2d_359[0][0]                 
__________________________________________________________________________________________________
activation_361 (Activation)     (None, 6, 6, 384)    0           batch_normalization_361[0][0]    
__________________________________________________________________________________________________
activation_362 (Activation)     (None, 6, 6, 384)    0           batch_normalization_362[0][0]    
__________________________________________________________________________________________________
activation_365 (Activation)     (None, 6, 6, 384)    0           batch_normalization_365[0][0]    
__________________________________________________________________________________________________
activation_366 (Activation)     (None, 6, 6, 384)    0           batch_normalization_366[0][0]    
__________________________________________________________________________________________________
batch_normalization_367 (BatchN (None, 6, 6, 192)    576         conv2d_367[0][0]                 
__________________________________________________________________________________________________
activation_359 (Activation)     (None, 6, 6, 320)    0           batch_normalization_359[0][0]    
__________________________________________________________________________________________________
mixed9_0 (Concatenate)          (None, 6, 6, 768)    0           activation_361[0][0]             
                                                                 activation_362[0][0]             
__________________________________________________________________________________________________
concatenate_7 (Concatenate)     (None, 6, 6, 768)    0           activation_365[0][0]             
                                                                 activation_366[0][0]             
__________________________________________________________________________________________________
activation_367 (Activation)     (None, 6, 6, 192)    0           batch_normalization_367[0][0]    
__________________________________________________________________________________________________
mixed9 (Concatenate)            (None, 6, 6, 2048)   0           activation_359[0][0]             
                                                                 mixed9_0[0][0]                   
                                                                 concatenate_7[0][0]              
                                                                 activation_367[0][0]             
__________________________________________________________________________________________________
conv2d_372 (Conv2D)             (None, 6, 6, 448)    917504      mixed9[0][0]                     
__________________________________________________________________________________________________
batch_normalization_372 (BatchN (None, 6, 6, 448)    1344        conv2d_372[0][0]                 
__________________________________________________________________________________________________
activation_372 (Activation)     (None, 6, 6, 448)    0           batch_normalization_372[0][0]    
__________________________________________________________________________________________________
conv2d_369 (Conv2D)             (None, 6, 6, 384)    786432      mixed9[0][0]                     
__________________________________________________________________________________________________
conv2d_373 (Conv2D)             (None, 6, 6, 384)    1548288     activation_372[0][0]             
__________________________________________________________________________________________________
batch_normalization_369 (BatchN (None, 6, 6, 384)    1152        conv2d_369[0][0]                 
__________________________________________________________________________________________________
batch_normalization_373 (BatchN (None, 6, 6, 384)    1152        conv2d_373[0][0]                 
__________________________________________________________________________________________________
activation_369 (Activation)     (None, 6, 6, 384)    0           batch_normalization_369[0][0]    
__________________________________________________________________________________________________
activation_373 (Activation)     (None, 6, 6, 384)    0           batch_normalization_373[0][0]    
__________________________________________________________________________________________________
conv2d_370 (Conv2D)             (None, 6, 6, 384)    442368      activation_369[0][0]             
__________________________________________________________________________________________________
conv2d_371 (Conv2D)             (None, 6, 6, 384)    442368      activation_369[0][0]             
__________________________________________________________________________________________________
conv2d_374 (Conv2D)             (None, 6, 6, 384)    442368      activation_373[0][0]             
__________________________________________________________________________________________________
conv2d_375 (Conv2D)             (None, 6, 6, 384)    442368      activation_373[0][0]             
__________________________________________________________________________________________________
average_pooling2d_36 (AveragePo (None, 6, 6, 2048)   0           mixed9[0][0]                     
__________________________________________________________________________________________________
conv2d_368 (Conv2D)             (None, 6, 6, 320)    655360      mixed9[0][0]                     
__________________________________________________________________________________________________
batch_normalization_370 (BatchN (None, 6, 6, 384)    1152        conv2d_370[0][0]                 
__________________________________________________________________________________________________
batch_normalization_371 (BatchN (None, 6, 6, 384)    1152        conv2d_371[0][0]                 
__________________________________________________________________________________________________
batch_normalization_374 (BatchN (None, 6, 6, 384)    1152        conv2d_374[0][0]                 
__________________________________________________________________________________________________
batch_normalization_375 (BatchN (None, 6, 6, 384)    1152        conv2d_375[0][0]                 
__________________________________________________________________________________________________
conv2d_376 (Conv2D)             (None, 6, 6, 192)    393216      average_pooling2d_36[0][0]       
__________________________________________________________________________________________________
batch_normalization_368 (BatchN (None, 6, 6, 320)    960         conv2d_368[0][0]                 
__________________________________________________________________________________________________
activation_370 (Activation)     (None, 6, 6, 384)    0           batch_normalization_370[0][0]    
__________________________________________________________________________________________________
activation_371 (Activation)     (None, 6, 6, 384)    0           batch_normalization_371[0][0]    
__________________________________________________________________________________________________
activation_374 (Activation)     (None, 6, 6, 384)    0           batch_normalization_374[0][0]    
__________________________________________________________________________________________________
activation_375 (Activation)     (None, 6, 6, 384)    0           batch_normalization_375[0][0]    
__________________________________________________________________________________________________
batch_normalization_376 (BatchN (None, 6, 6, 192)    576         conv2d_376[0][0]                 
__________________________________________________________________________________________________
activation_368 (Activation)     (None, 6, 6, 320)    0           batch_normalization_368[0][0]    
__________________________________________________________________________________________________
mixed9_1 (Concatenate)          (None, 6, 6, 768)    0           activation_370[0][0]             
                                                                 activation_371[0][0]             
__________________________________________________________________________________________________
concatenate_8 (Concatenate)     (None, 6, 6, 768)    0           activation_374[0][0]             
                                                                 activation_375[0][0]             
__________________________________________________________________________________________________
activation_376 (Activation)     (None, 6, 6, 192)    0           batch_normalization_376[0][0]    
__________________________________________________________________________________________________
mixed10 (Concatenate)           (None, 6, 6, 2048)   0           activation_368[0][0]             
                                                                 mixed9_1[0][0]                   
                                                                 concatenate_8[0][0]              
                                                                 activation_376[0][0]             
==================================================================================================
Total params: 21,802,784
Trainable params: 21,768,352
Non-trainable params: 34,432
__________________________________________________________________________________________________
In [19]:
#Adding custom Layers 
x = model.output
x = GlobalAveragePooling2D()(x)
predictions = Dense(4, activation="softmax")(x)

# creating the final model 
model_final = Model(input = model.input, output = predictions)

model_final.summary()

# Freeze all layers except final Dense softmax layer
for layer in model_final.layers[:-1]:
    layer.trainable = False
    
# Parallel computing
model_final = multi_gpu_model(model_final, gpus=2)

# compile the model 
model_final.compile(loss = "categorical_crossentropy", optimizer = optimizers.Adam(), metrics=["accuracy"])
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_4 (InputLayer)            (None, 256, 256, 3)  0                                            
__________________________________________________________________________________________________
conv2d_283 (Conv2D)             (None, 127, 127, 32) 864         input_4[0][0]                    
__________________________________________________________________________________________________
batch_normalization_283 (BatchN (None, 127, 127, 32) 96          conv2d_283[0][0]                 
__________________________________________________________________________________________________
activation_283 (Activation)     (None, 127, 127, 32) 0           batch_normalization_283[0][0]    
__________________________________________________________________________________________________
conv2d_284 (Conv2D)             (None, 125, 125, 32) 9216        activation_283[0][0]             
__________________________________________________________________________________________________
batch_normalization_284 (BatchN (None, 125, 125, 32) 96          conv2d_284[0][0]                 
__________________________________________________________________________________________________
activation_284 (Activation)     (None, 125, 125, 32) 0           batch_normalization_284[0][0]    
__________________________________________________________________________________________________
conv2d_285 (Conv2D)             (None, 125, 125, 64) 18432       activation_284[0][0]             
__________________________________________________________________________________________________
batch_normalization_285 (BatchN (None, 125, 125, 64) 192         conv2d_285[0][0]                 
__________________________________________________________________________________________________
activation_285 (Activation)     (None, 125, 125, 64) 0           batch_normalization_285[0][0]    
__________________________________________________________________________________________________
max_pooling2d_13 (MaxPooling2D) (None, 62, 62, 64)   0           activation_285[0][0]             
__________________________________________________________________________________________________
conv2d_286 (Conv2D)             (None, 62, 62, 80)   5120        max_pooling2d_13[0][0]           
__________________________________________________________________________________________________
batch_normalization_286 (BatchN (None, 62, 62, 80)   240         conv2d_286[0][0]                 
__________________________________________________________________________________________________
activation_286 (Activation)     (None, 62, 62, 80)   0           batch_normalization_286[0][0]    
__________________________________________________________________________________________________
conv2d_287 (Conv2D)             (None, 60, 60, 192)  138240      activation_286[0][0]             
__________________________________________________________________________________________________
batch_normalization_287 (BatchN (None, 60, 60, 192)  576         conv2d_287[0][0]                 
__________________________________________________________________________________________________
activation_287 (Activation)     (None, 60, 60, 192)  0           batch_normalization_287[0][0]    
__________________________________________________________________________________________________
max_pooling2d_14 (MaxPooling2D) (None, 29, 29, 192)  0           activation_287[0][0]             
__________________________________________________________________________________________________
conv2d_291 (Conv2D)             (None, 29, 29, 64)   12288       max_pooling2d_14[0][0]           
__________________________________________________________________________________________________
batch_normalization_291 (BatchN (None, 29, 29, 64)   192         conv2d_291[0][0]                 
__________________________________________________________________________________________________
activation_291 (Activation)     (None, 29, 29, 64)   0           batch_normalization_291[0][0]    
__________________________________________________________________________________________________
conv2d_289 (Conv2D)             (None, 29, 29, 48)   9216        max_pooling2d_14[0][0]           
__________________________________________________________________________________________________
conv2d_292 (Conv2D)             (None, 29, 29, 96)   55296       activation_291[0][0]             
__________________________________________________________________________________________________
batch_normalization_289 (BatchN (None, 29, 29, 48)   144         conv2d_289[0][0]                 
__________________________________________________________________________________________________
batch_normalization_292 (BatchN (None, 29, 29, 96)   288         conv2d_292[0][0]                 
__________________________________________________________________________________________________
activation_289 (Activation)     (None, 29, 29, 48)   0           batch_normalization_289[0][0]    
__________________________________________________________________________________________________
activation_292 (Activation)     (None, 29, 29, 96)   0           batch_normalization_292[0][0]    
__________________________________________________________________________________________________
average_pooling2d_28 (AveragePo (None, 29, 29, 192)  0           max_pooling2d_14[0][0]           
__________________________________________________________________________________________________
conv2d_288 (Conv2D)             (None, 29, 29, 64)   12288       max_pooling2d_14[0][0]           
__________________________________________________________________________________________________
conv2d_290 (Conv2D)             (None, 29, 29, 64)   76800       activation_289[0][0]             
__________________________________________________________________________________________________
conv2d_293 (Conv2D)             (None, 29, 29, 96)   82944       activation_292[0][0]             
__________________________________________________________________________________________________
conv2d_294 (Conv2D)             (None, 29, 29, 32)   6144        average_pooling2d_28[0][0]       
__________________________________________________________________________________________________
batch_normalization_288 (BatchN (None, 29, 29, 64)   192         conv2d_288[0][0]                 
__________________________________________________________________________________________________
batch_normalization_290 (BatchN (None, 29, 29, 64)   192         conv2d_290[0][0]                 
__________________________________________________________________________________________________
batch_normalization_293 (BatchN (None, 29, 29, 96)   288         conv2d_293[0][0]                 
__________________________________________________________________________________________________
batch_normalization_294 (BatchN (None, 29, 29, 32)   96          conv2d_294[0][0]                 
__________________________________________________________________________________________________
activation_288 (Activation)     (None, 29, 29, 64)   0           batch_normalization_288[0][0]    
__________________________________________________________________________________________________
activation_290 (Activation)     (None, 29, 29, 64)   0           batch_normalization_290[0][0]    
__________________________________________________________________________________________________
activation_293 (Activation)     (None, 29, 29, 96)   0           batch_normalization_293[0][0]    
__________________________________________________________________________________________________
activation_294 (Activation)     (None, 29, 29, 32)   0           batch_normalization_294[0][0]    
__________________________________________________________________________________________________
mixed0 (Concatenate)            (None, 29, 29, 256)  0           activation_288[0][0]             
                                                                 activation_290[0][0]             
                                                                 activation_293[0][0]             
                                                                 activation_294[0][0]             
__________________________________________________________________________________________________
conv2d_298 (Conv2D)             (None, 29, 29, 64)   16384       mixed0[0][0]                     
__________________________________________________________________________________________________
batch_normalization_298 (BatchN (None, 29, 29, 64)   192         conv2d_298[0][0]                 
__________________________________________________________________________________________________
activation_298 (Activation)     (None, 29, 29, 64)   0           batch_normalization_298[0][0]    
__________________________________________________________________________________________________
conv2d_296 (Conv2D)             (None, 29, 29, 48)   12288       mixed0[0][0]                     
__________________________________________________________________________________________________
conv2d_299 (Conv2D)             (None, 29, 29, 96)   55296       activation_298[0][0]             
__________________________________________________________________________________________________
batch_normalization_296 (BatchN (None, 29, 29, 48)   144         conv2d_296[0][0]                 
__________________________________________________________________________________________________
batch_normalization_299 (BatchN (None, 29, 29, 96)   288         conv2d_299[0][0]                 
__________________________________________________________________________________________________
activation_296 (Activation)     (None, 29, 29, 48)   0           batch_normalization_296[0][0]    
__________________________________________________________________________________________________
activation_299 (Activation)     (None, 29, 29, 96)   0           batch_normalization_299[0][0]    
__________________________________________________________________________________________________
average_pooling2d_29 (AveragePo (None, 29, 29, 256)  0           mixed0[0][0]                     
__________________________________________________________________________________________________
conv2d_295 (Conv2D)             (None, 29, 29, 64)   16384       mixed0[0][0]                     
__________________________________________________________________________________________________
conv2d_297 (Conv2D)             (None, 29, 29, 64)   76800       activation_296[0][0]             
__________________________________________________________________________________________________
conv2d_300 (Conv2D)             (None, 29, 29, 96)   82944       activation_299[0][0]             
__________________________________________________________________________________________________
conv2d_301 (Conv2D)             (None, 29, 29, 64)   16384       average_pooling2d_29[0][0]       
__________________________________________________________________________________________________
batch_normalization_295 (BatchN (None, 29, 29, 64)   192         conv2d_295[0][0]                 
__________________________________________________________________________________________________
batch_normalization_297 (BatchN (None, 29, 29, 64)   192         conv2d_297[0][0]                 
__________________________________________________________________________________________________
batch_normalization_300 (BatchN (None, 29, 29, 96)   288         conv2d_300[0][0]                 
__________________________________________________________________________________________________
batch_normalization_301 (BatchN (None, 29, 29, 64)   192         conv2d_301[0][0]                 
__________________________________________________________________________________________________
activation_295 (Activation)     (None, 29, 29, 64)   0           batch_normalization_295[0][0]    
__________________________________________________________________________________________________
activation_297 (Activation)     (None, 29, 29, 64)   0           batch_normalization_297[0][0]    
__________________________________________________________________________________________________
activation_300 (Activation)     (None, 29, 29, 96)   0           batch_normalization_300[0][0]    
__________________________________________________________________________________________________
activation_301 (Activation)     (None, 29, 29, 64)   0           batch_normalization_301[0][0]    
__________________________________________________________________________________________________
mixed1 (Concatenate)            (None, 29, 29, 288)  0           activation_295[0][0]             
                                                                 activation_297[0][0]             
                                                                 activation_300[0][0]             
                                                                 activation_301[0][0]             
__________________________________________________________________________________________________
conv2d_305 (Conv2D)             (None, 29, 29, 64)   18432       mixed1[0][0]                     
__________________________________________________________________________________________________
batch_normalization_305 (BatchN (None, 29, 29, 64)   192         conv2d_305[0][0]                 
__________________________________________________________________________________________________
activation_305 (Activation)     (None, 29, 29, 64)   0           batch_normalization_305[0][0]    
__________________________________________________________________________________________________
conv2d_303 (Conv2D)             (None, 29, 29, 48)   13824       mixed1[0][0]                     
__________________________________________________________________________________________________
conv2d_306 (Conv2D)             (None, 29, 29, 96)   55296       activation_305[0][0]             
__________________________________________________________________________________________________
batch_normalization_303 (BatchN (None, 29, 29, 48)   144         conv2d_303[0][0]                 
__________________________________________________________________________________________________
batch_normalization_306 (BatchN (None, 29, 29, 96)   288         conv2d_306[0][0]                 
__________________________________________________________________________________________________
activation_303 (Activation)     (None, 29, 29, 48)   0           batch_normalization_303[0][0]    
__________________________________________________________________________________________________
activation_306 (Activation)     (None, 29, 29, 96)   0           batch_normalization_306[0][0]    
__________________________________________________________________________________________________
average_pooling2d_30 (AveragePo (None, 29, 29, 288)  0           mixed1[0][0]                     
__________________________________________________________________________________________________
conv2d_302 (Conv2D)             (None, 29, 29, 64)   18432       mixed1[0][0]                     
__________________________________________________________________________________________________
conv2d_304 (Conv2D)             (None, 29, 29, 64)   76800       activation_303[0][0]             
__________________________________________________________________________________________________
conv2d_307 (Conv2D)             (None, 29, 29, 96)   82944       activation_306[0][0]             
__________________________________________________________________________________________________
conv2d_308 (Conv2D)             (None, 29, 29, 64)   18432       average_pooling2d_30[0][0]       
__________________________________________________________________________________________________
batch_normalization_302 (BatchN (None, 29, 29, 64)   192         conv2d_302[0][0]                 
__________________________________________________________________________________________________
batch_normalization_304 (BatchN (None, 29, 29, 64)   192         conv2d_304[0][0]                 
__________________________________________________________________________________________________
batch_normalization_307 (BatchN (None, 29, 29, 96)   288         conv2d_307[0][0]                 
__________________________________________________________________________________________________
batch_normalization_308 (BatchN (None, 29, 29, 64)   192         conv2d_308[0][0]                 
__________________________________________________________________________________________________
activation_302 (Activation)     (None, 29, 29, 64)   0           batch_normalization_302[0][0]    
__________________________________________________________________________________________________
activation_304 (Activation)     (None, 29, 29, 64)   0           batch_normalization_304[0][0]    
__________________________________________________________________________________________________
activation_307 (Activation)     (None, 29, 29, 96)   0           batch_normalization_307[0][0]    
__________________________________________________________________________________________________
activation_308 (Activation)     (None, 29, 29, 64)   0           batch_normalization_308[0][0]    
__________________________________________________________________________________________________
mixed2 (Concatenate)            (None, 29, 29, 288)  0           activation_302[0][0]             
                                                                 activation_304[0][0]             
                                                                 activation_307[0][0]             
                                                                 activation_308[0][0]             
__________________________________________________________________________________________________
conv2d_310 (Conv2D)             (None, 29, 29, 64)   18432       mixed2[0][0]                     
__________________________________________________________________________________________________
batch_normalization_310 (BatchN (None, 29, 29, 64)   192         conv2d_310[0][0]                 
__________________________________________________________________________________________________
activation_310 (Activation)     (None, 29, 29, 64)   0           batch_normalization_310[0][0]    
__________________________________________________________________________________________________
conv2d_311 (Conv2D)             (None, 29, 29, 96)   55296       activation_310[0][0]             
__________________________________________________________________________________________________
batch_normalization_311 (BatchN (None, 29, 29, 96)   288         conv2d_311[0][0]                 
__________________________________________________________________________________________________
activation_311 (Activation)     (None, 29, 29, 96)   0           batch_normalization_311[0][0]    
__________________________________________________________________________________________________
conv2d_309 (Conv2D)             (None, 14, 14, 384)  995328      mixed2[0][0]                     
__________________________________________________________________________________________________
conv2d_312 (Conv2D)             (None, 14, 14, 96)   82944       activation_311[0][0]             
__________________________________________________________________________________________________
batch_normalization_309 (BatchN (None, 14, 14, 384)  1152        conv2d_309[0][0]                 
__________________________________________________________________________________________________
batch_normalization_312 (BatchN (None, 14, 14, 96)   288         conv2d_312[0][0]                 
__________________________________________________________________________________________________
activation_309 (Activation)     (None, 14, 14, 384)  0           batch_normalization_309[0][0]    
__________________________________________________________________________________________________
activation_312 (Activation)     (None, 14, 14, 96)   0           batch_normalization_312[0][0]    
__________________________________________________________________________________________________
max_pooling2d_15 (MaxPooling2D) (None, 14, 14, 288)  0           mixed2[0][0]                     
__________________________________________________________________________________________________
mixed3 (Concatenate)            (None, 14, 14, 768)  0           activation_309[0][0]             
                                                                 activation_312[0][0]             
                                                                 max_pooling2d_15[0][0]           
__________________________________________________________________________________________________
conv2d_317 (Conv2D)             (None, 14, 14, 128)  98304       mixed3[0][0]                     
__________________________________________________________________________________________________
batch_normalization_317 (BatchN (None, 14, 14, 128)  384         conv2d_317[0][0]                 
__________________________________________________________________________________________________
activation_317 (Activation)     (None, 14, 14, 128)  0           batch_normalization_317[0][0]    
__________________________________________________________________________________________________
conv2d_318 (Conv2D)             (None, 14, 14, 128)  114688      activation_317[0][0]             
__________________________________________________________________________________________________
batch_normalization_318 (BatchN (None, 14, 14, 128)  384         conv2d_318[0][0]                 
__________________________________________________________________________________________________
activation_318 (Activation)     (None, 14, 14, 128)  0           batch_normalization_318[0][0]    
__________________________________________________________________________________________________
conv2d_314 (Conv2D)             (None, 14, 14, 128)  98304       mixed3[0][0]                     
__________________________________________________________________________________________________
conv2d_319 (Conv2D)             (None, 14, 14, 128)  114688      activation_318[0][0]             
__________________________________________________________________________________________________
batch_normalization_314 (BatchN (None, 14, 14, 128)  384         conv2d_314[0][0]                 
__________________________________________________________________________________________________
batch_normalization_319 (BatchN (None, 14, 14, 128)  384         conv2d_319[0][0]                 
__________________________________________________________________________________________________
activation_314 (Activation)     (None, 14, 14, 128)  0           batch_normalization_314[0][0]    
__________________________________________________________________________________________________
activation_319 (Activation)     (None, 14, 14, 128)  0           batch_normalization_319[0][0]    
__________________________________________________________________________________________________
conv2d_315 (Conv2D)             (None, 14, 14, 128)  114688      activation_314[0][0]             
__________________________________________________________________________________________________
conv2d_320 (Conv2D)             (None, 14, 14, 128)  114688      activation_319[0][0]             
__________________________________________________________________________________________________
batch_normalization_315 (BatchN (None, 14, 14, 128)  384         conv2d_315[0][0]                 
__________________________________________________________________________________________________
batch_normalization_320 (BatchN (None, 14, 14, 128)  384         conv2d_320[0][0]                 
__________________________________________________________________________________________________
activation_315 (Activation)     (None, 14, 14, 128)  0           batch_normalization_315[0][0]    
__________________________________________________________________________________________________
activation_320 (Activation)     (None, 14, 14, 128)  0           batch_normalization_320[0][0]    
__________________________________________________________________________________________________
average_pooling2d_31 (AveragePo (None, 14, 14, 768)  0           mixed3[0][0]                     
__________________________________________________________________________________________________
conv2d_313 (Conv2D)             (None, 14, 14, 192)  147456      mixed3[0][0]                     
__________________________________________________________________________________________________
conv2d_316 (Conv2D)             (None, 14, 14, 192)  172032      activation_315[0][0]             
__________________________________________________________________________________________________
conv2d_321 (Conv2D)             (None, 14, 14, 192)  172032      activation_320[0][0]             
__________________________________________________________________________________________________
conv2d_322 (Conv2D)             (None, 14, 14, 192)  147456      average_pooling2d_31[0][0]       
__________________________________________________________________________________________________
batch_normalization_313 (BatchN (None, 14, 14, 192)  576         conv2d_313[0][0]                 
__________________________________________________________________________________________________
batch_normalization_316 (BatchN (None, 14, 14, 192)  576         conv2d_316[0][0]                 
__________________________________________________________________________________________________
batch_normalization_321 (BatchN (None, 14, 14, 192)  576         conv2d_321[0][0]                 
__________________________________________________________________________________________________
batch_normalization_322 (BatchN (None, 14, 14, 192)  576         conv2d_322[0][0]                 
__________________________________________________________________________________________________
activation_313 (Activation)     (None, 14, 14, 192)  0           batch_normalization_313[0][0]    
__________________________________________________________________________________________________
activation_316 (Activation)     (None, 14, 14, 192)  0           batch_normalization_316[0][0]    
__________________________________________________________________________________________________
activation_321 (Activation)     (None, 14, 14, 192)  0           batch_normalization_321[0][0]    
__________________________________________________________________________________________________
activation_322 (Activation)     (None, 14, 14, 192)  0           batch_normalization_322[0][0]    
__________________________________________________________________________________________________
mixed4 (Concatenate)            (None, 14, 14, 768)  0           activation_313[0][0]             
                                                                 activation_316[0][0]             
                                                                 activation_321[0][0]             
                                                                 activation_322[0][0]             
__________________________________________________________________________________________________
conv2d_327 (Conv2D)             (None, 14, 14, 160)  122880      mixed4[0][0]                     
__________________________________________________________________________________________________
batch_normalization_327 (BatchN (None, 14, 14, 160)  480         conv2d_327[0][0]                 
__________________________________________________________________________________________________
activation_327 (Activation)     (None, 14, 14, 160)  0           batch_normalization_327[0][0]    
__________________________________________________________________________________________________
conv2d_328 (Conv2D)             (None, 14, 14, 160)  179200      activation_327[0][0]             
__________________________________________________________________________________________________
batch_normalization_328 (BatchN (None, 14, 14, 160)  480         conv2d_328[0][0]                 
__________________________________________________________________________________________________
activation_328 (Activation)     (None, 14, 14, 160)  0           batch_normalization_328[0][0]    
__________________________________________________________________________________________________
conv2d_324 (Conv2D)             (None, 14, 14, 160)  122880      mixed4[0][0]                     
__________________________________________________________________________________________________
conv2d_329 (Conv2D)             (None, 14, 14, 160)  179200      activation_328[0][0]             
__________________________________________________________________________________________________
batch_normalization_324 (BatchN (None, 14, 14, 160)  480         conv2d_324[0][0]                 
__________________________________________________________________________________________________
batch_normalization_329 (BatchN (None, 14, 14, 160)  480         conv2d_329[0][0]                 
__________________________________________________________________________________________________
activation_324 (Activation)     (None, 14, 14, 160)  0           batch_normalization_324[0][0]    
__________________________________________________________________________________________________
activation_329 (Activation)     (None, 14, 14, 160)  0           batch_normalization_329[0][0]    
__________________________________________________________________________________________________
conv2d_325 (Conv2D)             (None, 14, 14, 160)  179200      activation_324[0][0]             
__________________________________________________________________________________________________
conv2d_330 (Conv2D)             (None, 14, 14, 160)  179200      activation_329[0][0]             
__________________________________________________________________________________________________
batch_normalization_325 (BatchN (None, 14, 14, 160)  480         conv2d_325[0][0]                 
__________________________________________________________________________________________________
batch_normalization_330 (BatchN (None, 14, 14, 160)  480         conv2d_330[0][0]                 
__________________________________________________________________________________________________
activation_325 (Activation)     (None, 14, 14, 160)  0           batch_normalization_325[0][0]    
__________________________________________________________________________________________________
activation_330 (Activation)     (None, 14, 14, 160)  0           batch_normalization_330[0][0]    
__________________________________________________________________________________________________
average_pooling2d_32 (AveragePo (None, 14, 14, 768)  0           mixed4[0][0]                     
__________________________________________________________________________________________________
conv2d_323 (Conv2D)             (None, 14, 14, 192)  147456      mixed4[0][0]                     
__________________________________________________________________________________________________
conv2d_326 (Conv2D)             (None, 14, 14, 192)  215040      activation_325[0][0]             
__________________________________________________________________________________________________
conv2d_331 (Conv2D)             (None, 14, 14, 192)  215040      activation_330[0][0]             
__________________________________________________________________________________________________
conv2d_332 (Conv2D)             (None, 14, 14, 192)  147456      average_pooling2d_32[0][0]       
__________________________________________________________________________________________________
batch_normalization_323 (BatchN (None, 14, 14, 192)  576         conv2d_323[0][0]                 
__________________________________________________________________________________________________
batch_normalization_326 (BatchN (None, 14, 14, 192)  576         conv2d_326[0][0]                 
__________________________________________________________________________________________________
batch_normalization_331 (BatchN (None, 14, 14, 192)  576         conv2d_331[0][0]                 
__________________________________________________________________________________________________
batch_normalization_332 (BatchN (None, 14, 14, 192)  576         conv2d_332[0][0]                 
__________________________________________________________________________________________________
activation_323 (Activation)     (None, 14, 14, 192)  0           batch_normalization_323[0][0]    
__________________________________________________________________________________________________
activation_326 (Activation)     (None, 14, 14, 192)  0           batch_normalization_326[0][0]    
__________________________________________________________________________________________________
activation_331 (Activation)     (None, 14, 14, 192)  0           batch_normalization_331[0][0]    
__________________________________________________________________________________________________
activation_332 (Activation)     (None, 14, 14, 192)  0           batch_normalization_332[0][0]    
__________________________________________________________________________________________________
mixed5 (Concatenate)            (None, 14, 14, 768)  0           activation_323[0][0]             
                                                                 activation_326[0][0]             
                                                                 activation_331[0][0]             
                                                                 activation_332[0][0]             
__________________________________________________________________________________________________
conv2d_337 (Conv2D)             (None, 14, 14, 160)  122880      mixed5[0][0]                     
__________________________________________________________________________________________________
batch_normalization_337 (BatchN (None, 14, 14, 160)  480         conv2d_337[0][0]                 
__________________________________________________________________________________________________
activation_337 (Activation)     (None, 14, 14, 160)  0           batch_normalization_337[0][0]    
__________________________________________________________________________________________________
conv2d_338 (Conv2D)             (None, 14, 14, 160)  179200      activation_337[0][0]             
__________________________________________________________________________________________________
batch_normalization_338 (BatchN (None, 14, 14, 160)  480         conv2d_338[0][0]                 
__________________________________________________________________________________________________
activation_338 (Activation)     (None, 14, 14, 160)  0           batch_normalization_338[0][0]    
__________________________________________________________________________________________________
conv2d_334 (Conv2D)             (None, 14, 14, 160)  122880      mixed5[0][0]                     
__________________________________________________________________________________________________
conv2d_339 (Conv2D)             (None, 14, 14, 160)  179200      activation_338[0][0]             
__________________________________________________________________________________________________
batch_normalization_334 (BatchN (None, 14, 14, 160)  480         conv2d_334[0][0]                 
__________________________________________________________________________________________________
batch_normalization_339 (BatchN (None, 14, 14, 160)  480         conv2d_339[0][0]                 
__________________________________________________________________________________________________
activation_334 (Activation)     (None, 14, 14, 160)  0           batch_normalization_334[0][0]    
__________________________________________________________________________________________________
activation_339 (Activation)     (None, 14, 14, 160)  0           batch_normalization_339[0][0]    
__________________________________________________________________________________________________
conv2d_335 (Conv2D)             (None, 14, 14, 160)  179200      activation_334[0][0]             
__________________________________________________________________________________________________
conv2d_340 (Conv2D)             (None, 14, 14, 160)  179200      activation_339[0][0]             
__________________________________________________________________________________________________
batch_normalization_335 (BatchN (None, 14, 14, 160)  480         conv2d_335[0][0]                 
__________________________________________________________________________________________________
batch_normalization_340 (BatchN (None, 14, 14, 160)  480         conv2d_340[0][0]                 
__________________________________________________________________________________________________
activation_335 (Activation)     (None, 14, 14, 160)  0           batch_normalization_335[0][0]    
__________________________________________________________________________________________________
activation_340 (Activation)     (None, 14, 14, 160)  0           batch_normalization_340[0][0]    
__________________________________________________________________________________________________
average_pooling2d_33 (AveragePo (None, 14, 14, 768)  0           mixed5[0][0]                     
__________________________________________________________________________________________________
conv2d_333 (Conv2D)             (None, 14, 14, 192)  147456      mixed5[0][0]                     
__________________________________________________________________________________________________
conv2d_336 (Conv2D)             (None, 14, 14, 192)  215040      activation_335[0][0]             
__________________________________________________________________________________________________
conv2d_341 (Conv2D)             (None, 14, 14, 192)  215040      activation_340[0][0]             
__________________________________________________________________________________________________
conv2d_342 (Conv2D)             (None, 14, 14, 192)  147456      average_pooling2d_33[0][0]       
__________________________________________________________________________________________________
batch_normalization_333 (BatchN (None, 14, 14, 192)  576         conv2d_333[0][0]                 
__________________________________________________________________________________________________
batch_normalization_336 (BatchN (None, 14, 14, 192)  576         conv2d_336[0][0]                 
__________________________________________________________________________________________________
batch_normalization_341 (BatchN (None, 14, 14, 192)  576         conv2d_341[0][0]                 
__________________________________________________________________________________________________
batch_normalization_342 (BatchN (None, 14, 14, 192)  576         conv2d_342[0][0]                 
__________________________________________________________________________________________________
activation_333 (Activation)     (None, 14, 14, 192)  0           batch_normalization_333[0][0]    
__________________________________________________________________________________________________
activation_336 (Activation)     (None, 14, 14, 192)  0           batch_normalization_336[0][0]    
__________________________________________________________________________________________________
activation_341 (Activation)     (None, 14, 14, 192)  0           batch_normalization_341[0][0]    
__________________________________________________________________________________________________
activation_342 (Activation)     (None, 14, 14, 192)  0           batch_normalization_342[0][0]    
__________________________________________________________________________________________________
mixed6 (Concatenate)            (None, 14, 14, 768)  0           activation_333[0][0]             
                                                                 activation_336[0][0]             
                                                                 activation_341[0][0]             
                                                                 activation_342[0][0]             
__________________________________________________________________________________________________
conv2d_347 (Conv2D)             (None, 14, 14, 192)  147456      mixed6[0][0]                     
__________________________________________________________________________________________________
batch_normalization_347 (BatchN (None, 14, 14, 192)  576         conv2d_347[0][0]                 
__________________________________________________________________________________________________
activation_347 (Activation)     (None, 14, 14, 192)  0           batch_normalization_347[0][0]    
__________________________________________________________________________________________________
conv2d_348 (Conv2D)             (None, 14, 14, 192)  258048      activation_347[0][0]             
__________________________________________________________________________________________________
batch_normalization_348 (BatchN (None, 14, 14, 192)  576         conv2d_348[0][0]                 
__________________________________________________________________________________________________
activation_348 (Activation)     (None, 14, 14, 192)  0           batch_normalization_348[0][0]    
__________________________________________________________________________________________________
conv2d_344 (Conv2D)             (None, 14, 14, 192)  147456      mixed6[0][0]                     
__________________________________________________________________________________________________
conv2d_349 (Conv2D)             (None, 14, 14, 192)  258048      activation_348[0][0]             
__________________________________________________________________________________________________
batch_normalization_344 (BatchN (None, 14, 14, 192)  576         conv2d_344[0][0]                 
__________________________________________________________________________________________________
batch_normalization_349 (BatchN (None, 14, 14, 192)  576         conv2d_349[0][0]                 
__________________________________________________________________________________________________
activation_344 (Activation)     (None, 14, 14, 192)  0           batch_normalization_344[0][0]    
__________________________________________________________________________________________________
activation_349 (Activation)     (None, 14, 14, 192)  0           batch_normalization_349[0][0]    
__________________________________________________________________________________________________
conv2d_345 (Conv2D)             (None, 14, 14, 192)  258048      activation_344[0][0]             
__________________________________________________________________________________________________
conv2d_350 (Conv2D)             (None, 14, 14, 192)  258048      activation_349[0][0]             
__________________________________________________________________________________________________
batch_normalization_345 (BatchN (None, 14, 14, 192)  576         conv2d_345[0][0]                 
__________________________________________________________________________________________________
batch_normalization_350 (BatchN (None, 14, 14, 192)  576         conv2d_350[0][0]                 
__________________________________________________________________________________________________
activation_345 (Activation)     (None, 14, 14, 192)  0           batch_normalization_345[0][0]    
__________________________________________________________________________________________________
activation_350 (Activation)     (None, 14, 14, 192)  0           batch_normalization_350[0][0]    
__________________________________________________________________________________________________
average_pooling2d_34 (AveragePo (None, 14, 14, 768)  0           mixed6[0][0]                     
__________________________________________________________________________________________________
conv2d_343 (Conv2D)             (None, 14, 14, 192)  147456      mixed6[0][0]                     
__________________________________________________________________________________________________
conv2d_346 (Conv2D)             (None, 14, 14, 192)  258048      activation_345[0][0]             
__________________________________________________________________________________________________
conv2d_351 (Conv2D)             (None, 14, 14, 192)  258048      activation_350[0][0]             
__________________________________________________________________________________________________
conv2d_352 (Conv2D)             (None, 14, 14, 192)  147456      average_pooling2d_34[0][0]       
__________________________________________________________________________________________________
batch_normalization_343 (BatchN (None, 14, 14, 192)  576         conv2d_343[0][0]                 
__________________________________________________________________________________________________
batch_normalization_346 (BatchN (None, 14, 14, 192)  576         conv2d_346[0][0]                 
__________________________________________________________________________________________________
batch_normalization_351 (BatchN (None, 14, 14, 192)  576         conv2d_351[0][0]                 
__________________________________________________________________________________________________
batch_normalization_352 (BatchN (None, 14, 14, 192)  576         conv2d_352[0][0]                 
__________________________________________________________________________________________________
activation_343 (Activation)     (None, 14, 14, 192)  0           batch_normalization_343[0][0]    
__________________________________________________________________________________________________
activation_346 (Activation)     (None, 14, 14, 192)  0           batch_normalization_346[0][0]    
__________________________________________________________________________________________________
activation_351 (Activation)     (None, 14, 14, 192)  0           batch_normalization_351[0][0]    
__________________________________________________________________________________________________
activation_352 (Activation)     (None, 14, 14, 192)  0           batch_normalization_352[0][0]    
__________________________________________________________________________________________________
mixed7 (Concatenate)            (None, 14, 14, 768)  0           activation_343[0][0]             
                                                                 activation_346[0][0]             
                                                                 activation_351[0][0]             
                                                                 activation_352[0][0]             
__________________________________________________________________________________________________
conv2d_355 (Conv2D)             (None, 14, 14, 192)  147456      mixed7[0][0]                     
__________________________________________________________________________________________________
batch_normalization_355 (BatchN (None, 14, 14, 192)  576         conv2d_355[0][0]                 
__________________________________________________________________________________________________
activation_355 (Activation)     (None, 14, 14, 192)  0           batch_normalization_355[0][0]    
__________________________________________________________________________________________________
conv2d_356 (Conv2D)             (None, 14, 14, 192)  258048      activation_355[0][0]             
__________________________________________________________________________________________________
batch_normalization_356 (BatchN (None, 14, 14, 192)  576         conv2d_356[0][0]                 
__________________________________________________________________________________________________
activation_356 (Activation)     (None, 14, 14, 192)  0           batch_normalization_356[0][0]    
__________________________________________________________________________________________________
conv2d_353 (Conv2D)             (None, 14, 14, 192)  147456      mixed7[0][0]                     
__________________________________________________________________________________________________
conv2d_357 (Conv2D)             (None, 14, 14, 192)  258048      activation_356[0][0]             
__________________________________________________________________________________________________
batch_normalization_353 (BatchN (None, 14, 14, 192)  576         conv2d_353[0][0]                 
__________________________________________________________________________________________________
batch_normalization_357 (BatchN (None, 14, 14, 192)  576         conv2d_357[0][0]                 
__________________________________________________________________________________________________
activation_353 (Activation)     (None, 14, 14, 192)  0           batch_normalization_353[0][0]    
__________________________________________________________________________________________________
activation_357 (Activation)     (None, 14, 14, 192)  0           batch_normalization_357[0][0]    
__________________________________________________________________________________________________
conv2d_354 (Conv2D)             (None, 6, 6, 320)    552960      activation_353[0][0]             
__________________________________________________________________________________________________
conv2d_358 (Conv2D)             (None, 6, 6, 192)    331776      activation_357[0][0]             
__________________________________________________________________________________________________
batch_normalization_354 (BatchN (None, 6, 6, 320)    960         conv2d_354[0][0]                 
__________________________________________________________________________________________________
batch_normalization_358 (BatchN (None, 6, 6, 192)    576         conv2d_358[0][0]                 
__________________________________________________________________________________________________
activation_354 (Activation)     (None, 6, 6, 320)    0           batch_normalization_354[0][0]    
__________________________________________________________________________________________________
activation_358 (Activation)     (None, 6, 6, 192)    0           batch_normalization_358[0][0]    
__________________________________________________________________________________________________
max_pooling2d_16 (MaxPooling2D) (None, 6, 6, 768)    0           mixed7[0][0]                     
__________________________________________________________________________________________________
mixed8 (Concatenate)            (None, 6, 6, 1280)   0           activation_354[0][0]             
                                                                 activation_358[0][0]             
                                                                 max_pooling2d_16[0][0]           
__________________________________________________________________________________________________
conv2d_363 (Conv2D)             (None, 6, 6, 448)    573440      mixed8[0][0]                     
__________________________________________________________________________________________________
batch_normalization_363 (BatchN (None, 6, 6, 448)    1344        conv2d_363[0][0]                 
__________________________________________________________________________________________________
activation_363 (Activation)     (None, 6, 6, 448)    0           batch_normalization_363[0][0]    
__________________________________________________________________________________________________
conv2d_360 (Conv2D)             (None, 6, 6, 384)    491520      mixed8[0][0]                     
__________________________________________________________________________________________________
conv2d_364 (Conv2D)             (None, 6, 6, 384)    1548288     activation_363[0][0]             
__________________________________________________________________________________________________
batch_normalization_360 (BatchN (None, 6, 6, 384)    1152        conv2d_360[0][0]                 
__________________________________________________________________________________________________
batch_normalization_364 (BatchN (None, 6, 6, 384)    1152        conv2d_364[0][0]                 
__________________________________________________________________________________________________
activation_360 (Activation)     (None, 6, 6, 384)    0           batch_normalization_360[0][0]    
__________________________________________________________________________________________________
activation_364 (Activation)     (None, 6, 6, 384)    0           batch_normalization_364[0][0]    
__________________________________________________________________________________________________
conv2d_361 (Conv2D)             (None, 6, 6, 384)    442368      activation_360[0][0]             
__________________________________________________________________________________________________
conv2d_362 (Conv2D)             (None, 6, 6, 384)    442368      activation_360[0][0]             
__________________________________________________________________________________________________
conv2d_365 (Conv2D)             (None, 6, 6, 384)    442368      activation_364[0][0]             
__________________________________________________________________________________________________
conv2d_366 (Conv2D)             (None, 6, 6, 384)    442368      activation_364[0][0]             
__________________________________________________________________________________________________
average_pooling2d_35 (AveragePo (None, 6, 6, 1280)   0           mixed8[0][0]                     
__________________________________________________________________________________________________
conv2d_359 (Conv2D)             (None, 6, 6, 320)    409600      mixed8[0][0]                     
__________________________________________________________________________________________________
batch_normalization_361 (BatchN (None, 6, 6, 384)    1152        conv2d_361[0][0]                 
__________________________________________________________________________________________________
batch_normalization_362 (BatchN (None, 6, 6, 384)    1152        conv2d_362[0][0]                 
__________________________________________________________________________________________________
batch_normalization_365 (BatchN (None, 6, 6, 384)    1152        conv2d_365[0][0]                 
__________________________________________________________________________________________________
batch_normalization_366 (BatchN (None, 6, 6, 384)    1152        conv2d_366[0][0]                 
__________________________________________________________________________________________________
conv2d_367 (Conv2D)             (None, 6, 6, 192)    245760      average_pooling2d_35[0][0]       
__________________________________________________________________________________________________
batch_normalization_359 (BatchN (None, 6, 6, 320)    960         conv2d_359[0][0]                 
__________________________________________________________________________________________________
activation_361 (Activation)     (None, 6, 6, 384)    0           batch_normalization_361[0][0]    
__________________________________________________________________________________________________
activation_362 (Activation)     (None, 6, 6, 384)    0           batch_normalization_362[0][0]    
__________________________________________________________________________________________________
activation_365 (Activation)     (None, 6, 6, 384)    0           batch_normalization_365[0][0]    
__________________________________________________________________________________________________
activation_366 (Activation)     (None, 6, 6, 384)    0           batch_normalization_366[0][0]    
__________________________________________________________________________________________________
batch_normalization_367 (BatchN (None, 6, 6, 192)    576         conv2d_367[0][0]                 
__________________________________________________________________________________________________
activation_359 (Activation)     (None, 6, 6, 320)    0           batch_normalization_359[0][0]    
__________________________________________________________________________________________________
mixed9_0 (Concatenate)          (None, 6, 6, 768)    0           activation_361[0][0]             
                                                                 activation_362[0][0]             
__________________________________________________________________________________________________
concatenate_7 (Concatenate)     (None, 6, 6, 768)    0           activation_365[0][0]             
                                                                 activation_366[0][0]             
__________________________________________________________________________________________________
activation_367 (Activation)     (None, 6, 6, 192)    0           batch_normalization_367[0][0]    
__________________________________________________________________________________________________
mixed9 (Concatenate)            (None, 6, 6, 2048)   0           activation_359[0][0]             
                                                                 mixed9_0[0][0]                   
                                                                 concatenate_7[0][0]              
                                                                 activation_367[0][0]             
__________________________________________________________________________________________________
conv2d_372 (Conv2D)             (None, 6, 6, 448)    917504      mixed9[0][0]                     
__________________________________________________________________________________________________
batch_normalization_372 (BatchN (None, 6, 6, 448)    1344        conv2d_372[0][0]                 
__________________________________________________________________________________________________
activation_372 (Activation)     (None, 6, 6, 448)    0           batch_normalization_372[0][0]    
__________________________________________________________________________________________________
conv2d_369 (Conv2D)             (None, 6, 6, 384)    786432      mixed9[0][0]                     
__________________________________________________________________________________________________
conv2d_373 (Conv2D)             (None, 6, 6, 384)    1548288     activation_372[0][0]             
__________________________________________________________________________________________________
batch_normalization_369 (BatchN (None, 6, 6, 384)    1152        conv2d_369[0][0]                 
__________________________________________________________________________________________________
batch_normalization_373 (BatchN (None, 6, 6, 384)    1152        conv2d_373[0][0]                 
__________________________________________________________________________________________________
activation_369 (Activation)     (None, 6, 6, 384)    0           batch_normalization_369[0][0]    
__________________________________________________________________________________________________
activation_373 (Activation)     (None, 6, 6, 384)    0           batch_normalization_373[0][0]    
__________________________________________________________________________________________________
conv2d_370 (Conv2D)             (None, 6, 6, 384)    442368      activation_369[0][0]             
__________________________________________________________________________________________________
conv2d_371 (Conv2D)             (None, 6, 6, 384)    442368      activation_369[0][0]             
__________________________________________________________________________________________________
conv2d_374 (Conv2D)             (None, 6, 6, 384)    442368      activation_373[0][0]             
__________________________________________________________________________________________________
conv2d_375 (Conv2D)             (None, 6, 6, 384)    442368      activation_373[0][0]             
__________________________________________________________________________________________________
average_pooling2d_36 (AveragePo (None, 6, 6, 2048)   0           mixed9[0][0]                     
__________________________________________________________________________________________________
conv2d_368 (Conv2D)             (None, 6, 6, 320)    655360      mixed9[0][0]                     
__________________________________________________________________________________________________
batch_normalization_370 (BatchN (None, 6, 6, 384)    1152        conv2d_370[0][0]                 
__________________________________________________________________________________________________
batch_normalization_371 (BatchN (None, 6, 6, 384)    1152        conv2d_371[0][0]                 
__________________________________________________________________________________________________
batch_normalization_374 (BatchN (None, 6, 6, 384)    1152        conv2d_374[0][0]                 
__________________________________________________________________________________________________
batch_normalization_375 (BatchN (None, 6, 6, 384)    1152        conv2d_375[0][0]                 
__________________________________________________________________________________________________
conv2d_376 (Conv2D)             (None, 6, 6, 192)    393216      average_pooling2d_36[0][0]       
__________________________________________________________________________________________________
batch_normalization_368 (BatchN (None, 6, 6, 320)    960         conv2d_368[0][0]                 
__________________________________________________________________________________________________
activation_370 (Activation)     (None, 6, 6, 384)    0           batch_normalization_370[0][0]    
__________________________________________________________________________________________________
activation_371 (Activation)     (None, 6, 6, 384)    0           batch_normalization_371[0][0]    
__________________________________________________________________________________________________
activation_374 (Activation)     (None, 6, 6, 384)    0           batch_normalization_374[0][0]    
__________________________________________________________________________________________________
activation_375 (Activation)     (None, 6, 6, 384)    0           batch_normalization_375[0][0]    
__________________________________________________________________________________________________
batch_normalization_376 (BatchN (None, 6, 6, 192)    576         conv2d_376[0][0]                 
__________________________________________________________________________________________________
activation_368 (Activation)     (None, 6, 6, 320)    0           batch_normalization_368[0][0]    
__________________________________________________________________________________________________
mixed9_1 (Concatenate)          (None, 6, 6, 768)    0           activation_370[0][0]             
                                                                 activation_371[0][0]             
__________________________________________________________________________________________________
concatenate_8 (Concatenate)     (None, 6, 6, 768)    0           activation_374[0][0]             
                                                                 activation_375[0][0]             
__________________________________________________________________________________________________
activation_376 (Activation)     (None, 6, 6, 192)    0           batch_normalization_376[0][0]    
__________________________________________________________________________________________________
mixed10 (Concatenate)           (None, 6, 6, 2048)   0           activation_368[0][0]             
                                                                 mixed9_1[0][0]                   
                                                                 concatenate_8[0][0]              
                                                                 activation_376[0][0]             
__________________________________________________________________________________________________
global_average_pooling2d_4 (Glo (None, 2048)         0           mixed10[0][0]                    
__________________________________________________________________________________________________
dense_4 (Dense)                 (None, 4)            8196        global_average_pooling2d_4[0][0] 
==================================================================================================
Total params: 21,810,980
Trainable params: 21,776,548
Non-trainable params: 34,432
__________________________________________________________________________________________________
/home/shared/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:7: UserWarning: Update your `Model` call to the Keras 2 API: `Model(inputs=Tensor("in..., outputs=Tensor("de...)`
  import sys
In [20]:
# Initiate the train and test generators with data Augumentation 
train_datagen = ImageDataGenerator(rescale = 1./255,
                                   horizontal_flip = True,
                                   fill_mode = "nearest",
                                   zoom_range = 0.3,
                                   width_shift_range = 0.3,
                                   height_shift_range=0.3,
                                   rotation_range=30)

test_datagen = ImageDataGenerator(rescale = 1./255,
                                  horizontal_flip = True,
                                  fill_mode = "nearest",
                                  zoom_range = 0.3,
                                  width_shift_range = 0.3,
                                  height_shift_range=0.3,
                                  rotation_range=30)

train_generator = train_datagen.flow_from_directory(train_data_dir,
                                                    target_size = (img_height, img_width),
                                                    batch_size = batch_size, 
                                                    class_mode = "categorical")

validation_generator = test_datagen.flow_from_directory(validation_data_dir,
                                                        target_size = (img_height, img_width),
                                                        class_mode = "categorical")
Found 66813 images belonging to 4 classes.
Found 16703 images belonging to 4 classes.
In [ ]:
# Save the model according to the conditions  
checkpoint = ModelCheckpoint("InceptionV3.h5", monitor='val_acc', verbose=1, save_best_only=True, save_weights_only=False, mode='auto', period=1)
early = EarlyStopping(monitor='val_acc', min_delta=0, patience=10, verbose=1, mode='auto')
In [ ]:
# Train the model 
incepv3_history = model_final.fit_generator(train_generator,
                                        steps_per_epoch = math.floor(nb_train_samples/batch_size),
                                        epochs = epochs,
                                        validation_data = validation_generator,
                                        validation_steps = math.floor(nb_validation_samples/batch_size),
                                        callbacks = [checkpoint, early])
# Save history
with open('incepv3_train_history.p', 'wb') as f:
    pickle.dump(incepv3_history.history,f)
    
# Email notification for when this is done
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login("raa421@gmail.com", "Reventon21!")
 
msg = "HELLO SIR YOUR NETWORK IS TRAINED"
server.sendmail("raa421@gmail.com", "rafiayub@stanford.edu", msg)
server.quit()
print('Done.')
Epoch 1/50
20/66 [========>.....................] - ETA: 37:59 - loss: 1.1187 - acc: 0.5431
In [24]:
# Load history
with open('incepv3_train_history.p', 'rb') as f:
    train_history = pickle.load(f)
In [25]:
# History is a dictionary with keys ['acc','loss','val_acc','val_loss'] per epoch
plt.plot(train_history['acc'], label='Training', color='g',linewidth=2,marker='d')
plt.plot(train_history['val_acc'], label='Validation', color='r',linewidth=2,marker='d')
plt.legend()
plt.title('InceptionV3 accuracy on training dataset')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.savefig('incepv3_acc.jpg')
plt.show()

plt.plot(train_history['loss'], label='Training',color='g',linewidth=2,marker='d')
plt.plot(train_history['val_loss'], label='Validation',color='r',linewidth=2,marker='d')
plt.title('InceptionV3 loss on training dataset')
plt.legend()
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.savefig('incepv3_loss.jpg')
plt.show()
In [26]:
# Test the network!! First initiate test generator
test_generator = test_datagen.flow_from_directory(test_data_dir,
                                                        target_size = (img_height, img_width),
                                                        class_mode = "categorical")
# Now test model
test_loss = model_final.evaluate_generator(test_generator)
Found 968 images belonging to 4 classes.
In [27]:
model_final.metrics_names
Out[27]:
['loss', 'acc']
In [28]:
print('Test loss: ', test_loss[0])
print('Test acc: ', test_loss[1])
with open('incepv3_test_loss.p', 'wb') as f:
    pickle.dump(test_loss,f)
Test loss:  0.9668160736068221
Test acc:  0.6384297520661157

Compare performance of both nets

Load all variables

In [2]:
with open('incepv3_test_loss.p', 'rb') as f:
    iv3testloss = pickle.load(f)
with open('vgg_test_loss.p', 'rb') as f:
    vggtestloss = pickle.load(f)
with open('incepv3_train_history.p', 'rb') as f:
    iv3hist = pickle.load(f)
with open('vgg_train_history.p', 'rb') as f:
    vgghist = pickle.load(f) 
    
print('Done.')
Done.

Plot accuracy and loss

In [83]:
plt.rcParams['figure.figsize'] = (10, 10)
plt.figure()
f, ax = plt.subplots(2,2)
# Training accuracy
ax[0,0].plot(vgghist['acc'], label='VGG', color='g',linewidth=2,marker='d')
ax[0,0].plot(iv3hist['acc'], label='IV3', color='r',linewidth=2,marker='d')
ax[0,0].set_title('Training accuracy')
ax[0,0].set_xlabel('Epochs')
ax[0,0].set_ylabel('Accuracy')
ax[0,0].legend()
# Training loss
ax[0,1].plot(vgghist['loss'], label='VGG', color='g',linewidth=2,marker='d')
ax[0,1].plot(iv3hist['loss'], label='IV3', color='r',linewidth=2,marker='d')
ax[0,1].set_title('Training loss')
ax[0,1].set_xlabel('Epochs')
ax[0,1].set_ylabel('Loss')
ax[0,1].legend()
# Validation accuracy
ax[1,0].plot(vgghist['val_acc'], label='VGG', color='g',linewidth=2,marker='d')
ax[1,0].plot(iv3hist['val_acc'], label='IV3', color='r',linewidth=2,marker='d')
ax[1,0].set_title('Validation accuracy')
ax[1,0].set_xlabel('Epochs')
ax[1,0].set_ylabel('Accuracy')
ax[1,0].legend()
# Validation loss
ax[1,1].plot(vgghist['val_loss'], label='VGG', color='g',linewidth=2,marker='d')
ax[1,1].plot(iv3hist['val_loss'], label='IV3', color='r',linewidth=2,marker='d')
ax[1,1].set_title('Validation loss')
ax[1,1].set_xlabel('Epochs')
ax[1,1].set_ylabel('Loss')
ax[1,1].legend()
plt.suptitle('Performance comparison of VGG19 and InceptionV3', fontsize=16)
Out[83]:
Text(0.5,0.98,'Performance comparison of VGG19 and InceptionV3')
<matplotlib.figure.Figure at 0x7f914fce3be0>

Compare accuracies with model in paper

In [4]:
plt.rcParams['figure.figsize'] = (6, 6)

b = plt.bar([0,1,2],[round(100*vggtestloss[1]),round(100*iv3testloss[1]),97])

b[0].set_color('g')
b[1].set_color('r')
b[2].set_color('orange')
for rect in b:
    height = rect.get_height()
    plt.text(rect.get_x() + rect.get_width()/2.0, height, '%d' % int(height), ha='center', va='bottom')

plt.xticks([0,1,2],('VGG19','InceptionV3','Kermany et al'))
plt.yticks(np.linspace(0,100,11))
plt.ylabel('Accuracy (%)')
plt.title('Test accuracies')
plt.show()

Visualization

Load models and libraries needed - we use the help of a new module called keras-vis.

In [12]:
from vis.utils import utils
from keras import activations
import matplotlib.cm as cm
from vis.visualization import visualize_cam, visualize_saliency, overlay

vgg_model = load_model('vgg16_1.h5', custom_objects={'tf':tf})
incepv3_model = load_model('InceptionV3.h5',custom_objects={'tf':tf})

# Extract the model from the parallel computing model
vgg_model = vgg_model.layers[-2]
incepv3_model = incepv3_model.layers[-2]

print('Models loaded.')
Models loaded.

Change the top layer of both models from softmax to linear for visualization.

In [14]:
vgg_model.layers[-1].activation = activations.linear
vgg_model = utils.apply_modifications(vgg_model)

incepv3_model.layers[-1].activation = activations.linear
incepv3_model = utils.apply_modifications(incepv3_model)

print('Done.')
/home/shared/anaconda3/lib/python3.6/site-packages/keras/models.py:255: UserWarning: No training configuration found in save file: the model was *not* compiled. Compile it manually.
  warnings.warn('No training configuration found in save file: '
Done.

Load images to view saliency maps for - two from each category

In [75]:
%matplotlib inline
plt.rcParams['figure.figsize'] = (18, 20)

img1 = utils.load_img('data/test/CNV/CNV-6190971-1.jpeg', target_size=(256, 256, 3))
img2 = utils.load_img('data/test/CNV/CNV-5813701-3.jpeg', target_size=(256, 256, 3))
img3 = utils.load_img('data/test/DME/DME-7837305-5.jpeg', target_size=(256, 256, 3))
img4 = utils.load_img('data/test/DME/DME-9378346-1.jpeg', target_size=(256, 256, 3))
img5 = utils.load_img('data/test/DRUSEN/DRUSEN-8117834-1.jpeg', target_size=(256, 256, 3))
img6 = utils.load_img('data/test/DRUSEN/DRUSEN-8345703-2.jpeg', target_size=(256, 256, 3))
img7 = utils.load_img('data/test/NORMAL/NORMAL-1908313-1.jpeg', target_size=(256, 256, 3))
img8 = utils.load_img('data/test/NORMAL/NORMAL-2055634-1.jpeg', target_size=(256, 256, 3))

f, ax = plt.subplots(4, 2)
ax[0,0].imshow(img1[:,:,1], cmap='gray')
ax[0,1].imshow(img2[:,:,1], cmap='gray')
ax[1,0].imshow(img3[:,:,1], cmap='gray')
ax[1,1].imshow(img4[:,:,1], cmap='gray')
ax[2,0].imshow(img5[:,:,1], cmap='gray')
ax[2,1].imshow(img6[:,:,1], cmap='gray')
ax[3,0].imshow(img7[:,:,1], cmap='gray')
ax[3,1].imshow(img8[:,:,1], cmap='gray')
/home/shared/anaconda3/lib/python3.6/site-packages/skimage/transform/_warps.py:84: UserWarning: The default mode, 'constant', will be changed to 'reflect' in skimage 0.15.
  warn("The default mode, 'constant', will be changed to 'reflect' in "
Out[75]:
<matplotlib.image.AxesImage at 0x7f91510c9668>

Visualize saliency for VGG19

In [33]:
plt.figure()
f, ax = plt.subplots(4, 2)
plt.suptitle('VGG19 Saliency Maps', fontsize = 24)
for i, img in enumerate([img1, img2, img3, img4, img5, img6, img7, img8]):  
    print('Processing image %d...' % (i+1))
    grads = visualize_saliency(vgg_model, -1, filter_indices = None, seed_input=img, backprop_modifier='guided')
    row = math.floor(i/2)
    col = i % 2
    if row == 0: title = 'CNV'
    elif row == 1: title = 'DME'
    elif row == 2: title = 'DRUSEN'
    elif row == 3: title = 'NORMAL'
    # visualize grads as heatmap
    ax[row,col].imshow(grads, cmap='jet')
    ax[row,col].set_title(title)
    ax[row,col].get_xaxis().set_visible(False)
    ax[row,col].get_yaxis().set_visible(False)
Processing image 1...
Processing image 2...
Processing image 3...
Processing image 4...
Processing image 5...
Processing image 6...
Processing image 7...
Processing image 8...
<matplotlib.figure.Figure at 0x7f918b3cdda0>

Visualize saliency for InceptionV3

In [34]:
plt.figure()
f, ax = plt.subplots(4, 2)
plt.suptitle('InceptionV3 Saliency Maps', fontsize = 24)
for i, img in enumerate([img1, img2, img3, img4, img5, img6, img7, img8]):  
    print('Processing image %d...' % (i+1))
    grads = visualize_saliency(incepv3_model, -1, filter_indices = None, seed_input=img, backprop_modifier='guided')
    row = math.floor(i/2)
    col = i % 2
    if row == 0: title = 'CNV'
    elif row == 1: title = 'DME'
    elif row == 2: title = 'DRUSEN'
    elif row == 3: title = 'NORMAL'
    # visualize grads as heatmap
    ax[row,col].imshow(grads, cmap='jet')
    ax[row,col].set_title(title)
    ax[row,col].get_xaxis().set_visible(False)
    ax[row,col].get_yaxis().set_visible(False)
Processing image 1...
Processing image 2...
Processing image 3...
Processing image 4...
Processing image 5...
Processing image 6...
Processing image 7...
Processing image 8...
<matplotlib.figure.Figure at 0x7f918b46d2b0>

Visualize class activation maps (CAM) for VGG19 and InceptionV3

In [76]:
plt.figure()
f, ax = plt.subplots(4, 2)
plt.suptitle('InceptionV3 Class Activation Maps', fontsize = 24)
for i, img in enumerate([img1, img2, img3, img4, img5, img6, img7, img8]):  
    print('Processing image %d...' % (i+1))
    grads = visualize_cam(incepv3_model, -1, filter_indices=None, 
                          seed_input=img, backprop_modifier='guided') 
    row = math.floor(i/2)
    col = i % 2
    if row == 0: title = 'CNV'
    elif row == 1: title = 'DME'
    elif row == 2: title = 'DRUSEN'
    elif row == 3: title = 'NORMAL'
    
    img = np.concatenate((img[:,:,1][:,:,np.newaxis],img[:,:,1][:,:,np.newaxis],img[:,:,1][:,:,np.newaxis]),axis=2)
    
    # Lets overlay the heatmap onto original image.    
    jet_heatmap = grads
    ax[row,col].imshow(overlay(jet_heatmap, img))
    ax[row,col].set_title(title)
    ax[row,col].get_xaxis().set_visible(False)
    ax[row,col].get_yaxis().set_visible(False)
Processing image 1...
Processing image 2...
Processing image 3...
Processing image 4...
Processing image 5...
Processing image 6...
Processing image 7...
Processing image 8...
<matplotlib.figure.Figure at 0x7f91518ebcf8>
In [71]:
plt.figure()
f, ax = plt.subplots(4, 2)
plt.suptitle('VGG19 Class Activation Maps', fontsize = 24)
for i, img in enumerate([img1, img2, img3, img4, img5, img6, img7, img8]):  
    print('Processing image %d...' % (i+1))
    grads = visualize_cam(vgg_model, -1, filter_indices=None, 
                          seed_input=img, backprop_modifier='guided') 
    row = math.floor(i/2)
    col = i % 2
    if row == 0: title = 'CNV'
    elif row == 1: title = 'DME'
    elif row == 2: title = 'DRUSEN'
    elif row == 3: title = 'NORMAL'
    
    img = np.concatenate((img[:,:,1][:,:,np.newaxis],img[:,:,1][:,:,np.newaxis],img[:,:,1][:,:,np.newaxis]),axis=2)
    
    # Lets overlay the heatmap onto original image.    
    jet_heatmap = grads
    ax[row,col].imshow(overlay(jet_heatmap, img))
    ax[row,col].set_title(title)
    ax[row,col].get_xaxis().set_visible(False)
    ax[row,col].get_yaxis().set_visible(False)
Processing image 1...
Processing image 2...
Processing image 3...
Processing image 4...
Processing image 5...
Processing image 6...
Processing image 7...
Processing image 8...
<matplotlib.figure.Figure at 0x7f915223b550>

ROC curves and Confusion Matrices

Load VGG

In [4]:
# Load the VGG model
vgg = load_model('vgg16_1.h5', custom_objects={'tf':tf})
print('Done.')
Done.

Test VGG

In [6]:
# Constants
img_width, img_height = 256, 256
train_data_dir = "data/train"
validation_data_dir = "data/val"
test_data_dir = "data/test"

test_datagen = ImageDataGenerator(rescale = 1./255,
                                  horizontal_flip = True,
                                  fill_mode = "nearest",
                                  zoom_range = 0.3,
                                  width_shift_range = 0.3,
                                  height_shift_range=0.3,
                                  rotation_range=30)
# Test the network!! First initiate test generator
test_generator = test_datagen.flow_from_directory(test_data_dir,
                                                        target_size = (img_height, img_width),
                                                        class_mode = "categorical",
                                                        shuffle = False)
# Now test model
y_pred = vgg.predict_generator(test_generator)
print('Done.')
Found 968 images belonging to 4 classes.
Done.
In [11]:
y_pred_real = np.argmax(y_pred,axis=1)
y_test = test_generator.classes

Confusion matrix

In [13]:
def plot_confusion_matrix(cm, classes,
                          normalize=False,
                          title='Confusion matrix',
                          cmap=plt.cm.Blues):
    """
    This function prints and plots the confusion matrix.
    Normalization can be applied by setting `normalize=True`.
    """
    if normalize:
        cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
        print("Normalized confusion matrix")
    else:
        print('Confusion matrix, without normalization')

    print(cm)

    plt.imshow(cm, interpolation='nearest', cmap=cmap)
    plt.title(title)
    plt.colorbar()
    tick_marks = np.arange(len(classes))
    plt.xticks(tick_marks, classes, rotation=45)
    plt.yticks(tick_marks, classes)

    fmt = '.2f' if normalize else 'd'
    thresh = cm.max() / 2.
    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
        plt.text(j, i, format(cm[i, j], fmt),
                 horizontalalignment="center",
                 color="white" if cm[i, j] > thresh else "black")

    plt.tight_layout()
    plt.ylabel('True label')
    plt.xlabel('Predicted label')
In [26]:
class_names = list(test_generator.class_indices.keys())
# Compute confusion matrix
cnf_matrix = confusion_matrix(y_test, y_pred_real)
np.set_printoptions(precision=2)

# Plot non-normalized confusion matrix
plt.figure()
plot_confusion_matrix(cnf_matrix, classes=class_names,
                      title='VGG Confusion Matrix')

# Plot normalized confusion matrix
plt.figure()
plot_confusion_matrix(cnf_matrix, classes=class_names, normalize=True,
                      title='Normalized confusion matrix')

plt.show()
Confusion matrix, without normalization
[[239   3   0   0]
 [  0 242   0   0]
 [  4   0 237   1]
 [  0   0   0 242]]
Normalized confusion matrix
[[0.99 0.01 0.   0.  ]
 [0.   1.   0.   0.  ]
 [0.02 0.   0.98 0.  ]
 [0.   0.   0.   1.  ]]

ROC curve

In [25]:
# Recreate labels - 1 if not normal, 0 if normal
y_test_roc = [bool(y) for y in y_test]
y_pred_roc = [bool(y) for y in y_pred_real]

fpr, tpr, _ = roc_curve(y_test_roc, y_pred_roc)
roc_auc = auc(fpr, tpr)


plt.figure()
lw = 2
plt.plot(fpr, tpr, color='darkorange',
         lw=lw, label='area = %0.2f' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('VGG19 ROC curve - any condition vs. normal')
plt.legend(loc="lower right")
plt.show()

Load IV3

In [36]:
# Load the VGG model
iv3 = load_model('InceptionV3.h5', custom_objects={'tf':tf})
print('Done.')
Done.

Test IV3

In [37]:
# Constants
img_width, img_height = 256, 256
train_data_dir = "data/train"
validation_data_dir = "data/val"
test_data_dir = "data/test"

test_datagen = ImageDataGenerator(rescale = 1./255,
                                  horizontal_flip = True,
                                  fill_mode = "nearest",
                                  zoom_range = 0.3,
                                  width_shift_range = 0.3,
                                  height_shift_range=0.3,
                                  rotation_range=30)
# Test the network!! First initiate test generator
test_generator = test_datagen.flow_from_directory(test_data_dir,
                                                        target_size = (img_height, img_width),
                                                        class_mode = "categorical",
                                                        shuffle = False)
# Now test model
y_pred = iv3.predict_generator(test_generator)
print('Done.')
Found 968 images belonging to 4 classes.
Done.
In [38]:
y_pred_real = np.argmax(y_pred,axis=1)
y_test = test_generator.classes

Confusion matrix

In [39]:
def plot_confusion_matrix(cm, classes,
                          normalize=False,
                          title='Confusion matrix',
                          cmap=plt.cm.Blues):
    """
    This function prints and plots the confusion matrix.
    Normalization can be applied by setting `normalize=True`.
    """
    if normalize:
        cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
        print("Normalized confusion matrix")
    else:
        print('Confusion matrix, without normalization')

    print(cm)

    plt.imshow(cm, interpolation='nearest', cmap=cmap)
    plt.title(title)
    plt.colorbar()
    tick_marks = np.arange(len(classes))
    plt.xticks(tick_marks, classes, rotation=45)
    plt.yticks(tick_marks, classes)

    fmt = '.2f' if normalize else 'd'
    thresh = cm.max() / 2.
    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
        plt.text(j, i, format(cm[i, j], fmt),
                 horizontalalignment="center",
                 color="white" if cm[i, j] > thresh else "black")

    plt.tight_layout()
    plt.ylabel('True label')
    plt.xlabel('Predicted label')
In [40]:
class_names = list(test_generator.class_indices.keys())
# Compute confusion matrix
cnf_matrix = confusion_matrix(y_test, y_pred_real)
np.set_printoptions(precision=2)

# Plot non-normalized confusion matrix
plt.figure()
plot_confusion_matrix(cnf_matrix, classes=class_names,
                      title='IV3 Confusion Matrix')

# Plot normalized confusion matrix
plt.figure()
plot_confusion_matrix(cnf_matrix, classes=class_names, normalize=True,
                      title='Normalized confusion matrix')

plt.show()
Confusion matrix, without normalization
[[206   6  25   5]
 [ 74  85  47  36]
 [ 61  12 144  25]
 [ 13   5  14 210]]
Normalized confusion matrix
[[0.85 0.02 0.1  0.02]
 [0.31 0.35 0.19 0.15]
 [0.25 0.05 0.6  0.1 ]
 [0.05 0.02 0.06 0.87]]

ROC curve

In [41]:
# Recreate labels - 1 if not normal, 0 if normal
y_test_roc = [bool(y) for y in y_test]
y_pred_roc = [bool(y) for y in y_pred_real]

fpr, tpr, _ = roc_curve(y_test_roc, y_pred_roc)
roc_auc = auc(fpr, tpr)


plt.figure()
lw = 2
plt.plot(fpr, tpr, color='darkorange',
         lw=lw, label='area = %0.2f' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('IV3 ROC curve - any condition vs. normal')
plt.legend(loc="lower right")
plt.show()